嵌套异步函数的Python3优雅方式

时间:2019-06-30 09:22:38

标签: python-3.x async-await python-asyncio

我正在尝试异步修改python3中异步函数的返回值。抱歉,这令人困惑...也许下面的代码将有助于澄清。

下面的代码有效,但是我想知道是否有更优雅的方式编写“ resolve_user”函​​数,这是我唯一可以修改的函数。

from aiodataloader import DataLoader
import asyncio

class MyUserLoader(DataLoader):

    async def batch_load_fn(self, keys):
        print('Keys', keys)
        return keys

def resolve_user(dataloader, key):
    promise = dataloader.load(key)

    async def to_upper():
        value = await promise
        return value.upper()

    return to_upper()

async def test():
    dataloader = MyUserLoader()
    req1 = resolve_user(dataloader, 'user1')
    req2 = resolve_user(dataloader, 'user2')
    print('Values', await req1, await req2)

asyncio.run(test())

上面的代码显示以下内容,这是我想要的行为。加载调用已批量处理。

Keys ['user1', 'user2']
Values USER1 USER2

如果resolve_user函数如下所示:

async def resolve_user(dataloader, key):
    return (await dataloader.load(key)).upper()

然后将不批处理装入调用。这是因为等待呼叫阻塞。程序将打印以下内容:

Keys ['user1']
Keys ['user2']
Values USER1 USER2

再一次,我想知道是否还有一种更Python化的方式来编写第一个resolve_user实现。

0 个答案:

没有答案