MENU

python3 aiohttp报错Timeout context manager should be used inside a task

July 18, 2021 •

aiohttp报错.jpg

报错如图。根据字面意思来看“在任务(协程)中使用超时管理器”。可是问题是确实是在协程中使用的timeout,不应该出现这样的问题啊。这是怎么回事呢。

查看了aiohttp报错的源码:

def __enter__(self) -> BaseTimerContext:
    task = current_task(loop=self._loop)
    if task is None:
        raise RuntimeError(
            "Timeout context manager should be used " "inside a task"
        )

只有在task是None的时候才会返回这样的错误。这就有些迷惑了,已经获取了事件循环,并且也将aiohttp放入了事件循环中,怎么还会出现这样的错误!
后来上网一查,原因是在python3.7以后版本,所有涉及异步的代码都要放到async函数里面,我擦。
之前的编程习惯是将 asyncio.get_event_loop() aiohttp.ClientSession(loop=self.loop)放在init下面。现在改到loop协程中就好了。