【问题标题】:Can I use asyncio.wait_for() as a context manager?我可以使用 asyncio.wait_for() 作为上下文管理器吗?
【发布时间】:2016-01-09 12:52:37
【问题描述】:

为什么这不起作用:

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__ 方法(async with aiohttp.get() 有效的事实证明了这一点)。

【问题讨论】:

  • 在使用wait_for时应该去掉async
  • 为什么? asyncio.wait_for 是一个协程。但是尽管如此,我还是得到了 __exit__ 的 AttributeError

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


【解决方案1】:

你不能写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 中的第二个示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 2018-07-15
    • 1970-01-01
    • 1970-01-01
    • 2020-06-08
    • 1970-01-01
    相关资源
    最近更新 更多