Python: 依次等待协程列表

Python: awaiting a list of coroutines sequentially

我想在 Python 中依次等待协程列表,即我不想使用 asyncio.gather(*coros)。这样做的原因是我正在尝试调试我的应用程序,所以我想传递一个命令行开关以按特定顺序将内容传递给 运行,这样我每次应用程序时都会获得一致的行为 运行s.

我试过这样做:

if args.sequential:
    fields = [await coro for coro in coros]
else:
    fields = await asyncio.gather(*coros)

但顺序版本似乎无法正常工作,即我收到此警告:

sys:1: RuntimeWarning: coroutine 'get_fields' was never awaited

我做错了什么?

一旦在某处创建了协程,asyncio 期望在事件循环关闭之前等待它(在脚本完成执行之前):

import asyncio


async def bla():
    await asyncio.sleep(1)
    print('done')


async def main():
    bla()  # Create coro, but don't await


loop = asyncio.get_event_loop()
loop.run_until_complete(main())

结果:

RuntimeWarning: coroutine 'bla' was never awaited

我们需要这个警告,因为很容易忘记 await 而从未等待的协程几乎总是意味着错误。

由于您的 async_op 中的一个抛出错误,因此在脚本完成时从未等待之前创建的某些协程。这就是你收到警告的原因。

换句话说,发生了这样的事情:

async def bla1():
    print('done')


async def bla2():
    raise Exception()


async def main():
    b1 = bla1()

    b2 = bla2()  # but here is exception ...

    await bla1()  # ... and this line was never reached