之前我使用asyncio.wait_for
进行超时控制,效果非常好。最近,我学习了aiohttp包,发现它使用asyncio_timeout.timeout
代替超时控制。然后我读了asyncio_timeout的github页面(https://github.com/aio-libs/async-timeout)。作者声称它的运行速度比asyncio.wait_for
快。所以我有两个问题:
asyncio_timeout.timeout
可以完全取代asyncio.wait_for
吗?我应该更换所有asyncio.wait_for
以提高速度吗?我正在编写一个websocket客户端,asyncio.wait_for
当前控制websocket.recv
,这是经常调用的。asyncio_timeout.timeout
应与async with
一起使用。但是在aiohttp帮助页面中,他们使用with
而不是async with
(http://aiohttp.readthedocs.io/en/stable/)。哪一个是正确的?答案 0 :(得分:4)
asyncio_timeout.timeout
比asyncio.wait_for
快,真实。
wait_for
创建一个新任务。它对应用程序代码可能并不重要,但对于库来说非常充分。例如,asyncpg
尝试使用wait_for
,但为了速度而拒绝。asyncio_timeout
之外,tornado.web.RequestHandler.get
可以在任何地方使用等。龙卷风仍然不支持任务取消,我希望它将在龙卷风5.0中修复async_timeout.timeout
适用于async with
和with
。人们多次对with
语句感到困惑:在asyncio
世界中鼓励异步操作。这就是我添加异步上下文管理器支持并鼓励这种用法的原因。为了向后兼容,我会支持with
很长一段时间 - 我只是不想鼓励这种语法。