报错如图。根据字面意思来看“在任务(协程)中使用超时管理器”。可是问题是确实是在协程中使用的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协程中就好了。