zwo*_*wol 4 python python-asyncio python-3.5
使用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()
Run Code Online (Sandbox Code Playgroud)
它wait_for提供了两个功能:
你的例子:
await f1
await asyncio.wait_for(f1, None) # or simply asyncio.wait_for(f1)
Run Code Online (Sandbox Code Playgroud)
除了调用额外包装器(wait_for)的开销之外,它们是相同的(https://github.com/python/cpython/blob/master/Lib/asyncio/tasks.py#L318).
两者都awaits将无限期地等待结果(或异常).在这种情况下,普通await更合适.
另一方面,如果您提供超时参数,它将等待具有时间约束的结果.如果它将超过超时,它将提高TimeoutError,未来将被取消.
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)
Run Code Online (Sandbox Code Playgroud)
另一件事是循环参数.在大多数情况下你不应该被打扰,用例是有限的:为测试注入不同的循环,运行其他循环...
这个参数的问题是,所有后续任务/函数也应该传递循环...
更多信息https://github.com/python/asyncio/issues/362
| 归档时间: |
|
| 查看次数: |
1824 次 |
| 最近记录: |