"await future"和"await asyncio.wait_for(future,None)"之间有区别吗?

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)

kwa*_*nek 5

wait_for提供了两个功能:

  1. 允许定义超时,
  2. 让你指定循环

你的例子:

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