asyncio.gather中的链式异步协程内联

问题描述 投票:2回答:1

我有一个假设的asyncio.gather场景:

await asyncio.gather(
    cor1,
    [cor2, cor3],
    cor4,
)

我希望在此依次执行cor2cor3。除了像这样定义外部协程之外,是否还有其他捷径可做:

async def cor2_cor3():
    await cor2
    await cor3

await asyncio.gather(
    cor1,
    cor2_cor3,
    cor4,
)

是否有更干净的快捷方式?

python python-asyncio
1个回答
0
投票

是否有更干净的快捷方式?

asyncio不提供开箱即用的功能。如果异步任务具有与JavaScript的Promise.then等效的方法,则可以编写Promise.then。但是异步等效项asyncio.create_task(cor2()).then(cor3())是一个更底层的结构,它仅设置回调而不返回任何内容,这给链接带来了不便。

为了执行协程,您将需要编写一个简单的实用程序函数,例如:

add_done_callback

然后您可以将add_done_callback调用为:

def chain(*aws):
    ret = None
    for aw in aws:
        ret = await aw
    return ret
© www.soinside.com 2019 - 2024. All rights reserved.