async_timeout.timeout与asyncio.wait_for

时间:2017-10-29 13:32:25

标签: python-3.x python-asyncio aiohttp

之前我使用asyncio.wait_for进行超时控制,效果非常好。最近,我学习了aiohttp包,发现它使用asyncio_timeout.timeout代替超时控制。然后我读了asyncio_timeout的github页面(https://github.com/aio-libs/async-timeout)。作者声称它的运行速度比asyncio.wait_for快。所以我有两个问题:

  1. asyncio_timeout.timeout可以完全取代asyncio.wait_for吗?我应该更换所有asyncio.wait_for以提高速度吗?我正在编写一个websocket客户端,asyncio.wait_for当前控制websocket.recv,这是经常调用的。
  2. 在"用法示例"部分(https://github.com/aio-libs/async-timeout),似乎asyncio_timeout.timeout应与async with一起使用。但是在aiohttp帮助页面中,他们使用with而不是async withhttp://aiohttp.readthedocs.io/en/stable/)。哪一个是正确的?

1 个答案:

答案 0 :(得分:4)

  1. asyncio_timeout.timeoutasyncio.wait_for快,真实。 wait_for创建一个新任务。它对应用程序代码可能并不重要,但对于库来说非常充分。例如,asyncpg尝试使用wait_for,但为了速度而拒绝。
  2. 除了asyncio_timeout之外,
  3. tornado.web.RequestHandler.get可以在任何地方使用等。龙卷风仍然不支持任务取消,我希望它将在龙卷风5.0中修复
  4. 从技术上讲,async_timeout.timeout适用于async withwith。人们多次对with语句感到困惑:在asyncio世界中鼓励异步操作。这就是我添加异步上下文管理器支持并鼓励这种用法的原因。为了向后兼容,我会支持with很长一段时间 - 我只是不想鼓励这种语法。