在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
  • Passing asyncio loop by argument or using default asyncio loop
  • Why use explicit loop parameter with aiohttp?
  • 关于python - 'await future'和 'await asyncio.wait_for(future, None)'之间有区别吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46205583/

    10-12 23:52