您可以使用其中一个
waiting primitives
例如
asyncio.wait
或
asyncio.as_completed
.
import asyncio
async def select(*awaitables):
return await next(asyncio.as_completed(awaitables))
实例
async def fast():
await asyncio.sleep(0.2)
return 1
async def slow():
await asyncio.sleep(1)
return 2
async def main():
result = await select(fast(), slow())
print(result)
asyncio.run(main())
# 1
在三人组中,您也可以使用
supervisor
。从文档中:
这里有一个函数,它接受一个函数列表,同时运行所有函数,并从第一个完成的函数返回结果:
async def race(*async_fns):
if not async_fns:
raise ValueError("must pass at least one argument")
winner = None
async def jockey(async_fn, cancel_scope):
nonlocal winner
winner = await async_fn()
cancel_scope.cancel()
async with trio.open_nursery() as nursery:
for async_fn in async_fns:
nursery.start_soon(jockey, async_fn, nursery.cancel_scope)
return winner
这是通过启动一组任务来实现的,每个任务都试图运行各自的功能。一旦第一个函数完成执行,任务就会设置非局部变量
winner
从外部范围到函数的结果,并使用传入的取消范围取消其他任务。一旦所有任务都被取消(这将退出托儿所块),变量
赢家
将被退回。