在python 3.5或更高版本中,将await
直接应用于将来或任务与将其与asyncio.wait_for
包装之间有什么区别吗?该文档尚不清楚何时适合使用wait_for
,我想知道这是否是旧的基于生成器的库的痕迹。下面的测试程序似乎没有什么区别,但这并不能证明任何事情。
import asyncio
async def task_one():
await asyncio.sleep(0.1)
return 1
async def task_two():
await asyncio.sleep(0.1)
return 2
async def test(loop):
t1 = loop.create_task(task_one())
t2 = loop.create_task(task_two())
print(repr(await t1))
print(repr(await asyncio.wait_for(t2, None)))
def main():
loop = asyncio.get_event_loop()
try:
loop.run_until_complete(test(loop))
finally:
loop.close()
main()
最佳答案
wait_for
提供了另外两个功能:
你的例子:
await f1
await asyncio.wait_for(f1, None) # or simply asyncio.wait_for(f1)
除了调用附加包装器(wait_for)的开销外,它们是相同的(https://github.com/python/cpython/blob/master/Lib/asyncio/tasks.py#L318)。
两个
awaits
都将无限期地等待结果(或异常)。在这种情况下,简单的await
更合适。另一方面,如果提供timeout参数,它将等待有时间限制的结果。而且如果花费的时间超过了超时时间,它将引发
TimeoutError
,并且 future 将被取消。async def my_func():
await asyncio.sleep(10)
return 'OK'
# will wait 10s
await my_func()
# will wait only 5 seconds and then will raise TimeoutError
await asyncio.wait_for(my_func(), 5)
另一件事是循环参数。在大多数情况下,您不应该被打扰,用例是有限的:注入(inject)不同的循环进行测试,运行其他循环...
此参数的问题在于,所有后续任务/功能也应该传递该循环。
更多信息https://github.com/python/asyncio/issues/362
关于python - 'await future'和 'await asyncio.wait_for(future, None)'之间有区别吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46205583/