gpt4 book ai didi

Python:依次等待协程列表

转载 作者:行者123 更新时间:2023-11-28 17:08:09 24 4
gpt4 key购买 nike

我想在 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

我做错了什么?

最佳答案

一旦在某个地方创建了协程,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

关于Python:依次等待协程列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49686286/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com