我想在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
我做错了什么?
答案 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