asyncio.gather 中内联链 asyncio 协程

Gra*_*rus 6 python python-asyncio

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

await asyncio.gather(
    cor1,
    [cor2, cor3],
    cor4,
)
Run Code Online (Sandbox Code Playgroud)

我愿意在这里cor2cor3顺序被处决。除了像这样定义外部协程之外,还有其他快捷方式吗:

async def cor2_cor3():
    await cor2
    await cor3

await asyncio.gather(
    cor1,
    cor2_cor3,
    cor4,
)
Run Code Online (Sandbox Code Playgroud)

有没有更干净的捷径?

use*_*342 5

有没有更干净的捷径?

asyncio 不提供开箱即用的功能。如果 asyncio 任务有一个与 JavaScript 等效的方法Promise.then,您就可以使用asyncio.create_task(cor2()).then(cor3()). 但 asyncio 的等价物add_done_callback是一个更底层的构造,它只设置回调而不创建新的 future,这使得链接不方便。

要按顺序执行协程,您需要编写一个简单的实用函数,例如(未经测试):

async def chain(*aws):
    ret = None
    for aw in aws:
        ret = await aw
    return ret
Run Code Online (Sandbox Code Playgroud)

然后您可以调用gather为:

await asyncio.gather(cor1(), chain(cor2(), cor3()), cor4())
Run Code Online (Sandbox Code Playgroud)