我可以使用asyncio.wait_for()作为上下文管理器吗?

时间:2016-01-09 12:52:37

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

为什么不能这样做:

try:
    async with asyncio.wait_for(aiohttp.get(url), 2) as resp:
        print(resp.text())
except asyncio.TimeoutError as e:
    pass

给出

async with asyncio.wait_for(aiohttp.get(url), 2) as resp:
AttributeError: __aexit__

根据我的理解,asyncio.wait_for()会传递aiohttp.get()的未来,其__aenter____aexit__方法({{1}这一事实证明了这一点)工作)。

1 个答案:

答案 0 :(得分:3)

您无法编写async with wait_for(...) - wait_for不支持异步上下文管理器。

我很快将Timeout课程添加到asyncio - 请参阅https://groups.google.com/forum/#!topic/python-tulip/aRc3VBIXyRc对话。

现在你可以尝试aiohttp.Timeout(它需要安装一个足够胖的包) - 或者只是复制这40行代码。

有趣的是:这种方法并不需要async with - 只需要旧的with即可。

UPD 我错过了你已经使用过aiohttp了。 因此,请遵循aiohttp timeouts chapter中的第二个示例。