Python:依次等待协程列表

时间:2018-04-06 05:56:36

标签: python asynchronous python-3.5 python-asyncio

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

我尝试这样做:

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

我做错了什么?

1 个答案:

答案 0 :(得分:2)

一旦在某处创建了协同程序,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