我有一些代码可以在循环中运行多个任务,如下所示:
done, running = await asyncio.wait(running, timeout=timeout_seconds,
return_when=asyncio.FIRST_COMPLETED)
我需要能够确定其中哪个超时。根据文件:
请注意,此函数不会引发异步。超时错误。超时发生时未完成的Future或Task只会在第二个集合中返回。
我可以使用wait_for()
,但该函数只接受一个awaitable,而我需要指定多个。有什么方法可以确定我传递给wait()
的一组可用项中的哪一个对超时负责吗?
或者,有没有一种方法可以将wait_for()
与多个awaitable一起使用?
你可以试试这些技巧,可能这不是一个好的解决方案:
import asyncio
async def foo():
return 42
async def need_some_sleep():
await asyncio.sleep(1000)
return 42
async def coro_wrapper(coro):
result = await asyncio.wait_for(coro(), timeout=10)
return result
loop = asyncio.get_event_loop()
done, running = loop.run_until_complete(asyncio.wait(
[coro_wrapper(foo), coro_wrapper(need_some_sleep)],
return_when=asyncio.FIRST_COMPLETED
)
)
for item in done:
print(item.result())
print(done, running)
以下是我的操作方法:
done, pending = await asyncio.wait({
asyncio.create_task(task, name=index)
for index, task in enumerate([
my_coroutine(),
my_coroutine(),
my_coroutine(),
])
},
return_when=asyncio.FIRST_COMPLETED
)
num = next(t.get_name() for t in done)
if num == 2:
pass
使用enumerate
在创建任务时对其进行命名。