异常事件循环在 python 3.8 中使用 aiohttp 和 asyncio 关闭

Posted

技术标签:

【中文标题】异常事件循环在 python 3.8 中使用 aiohttp 和 asyncio 关闭【英文标题】:Exception event loop is closed with aiohttp and asyncio in python 3.8 【发布时间】:2019-12-09 19:23:32 【问题描述】:

我正在使用 asyncio 和 aiohttp 来发出并发请求。我最近将 Python 升级到了 3.8.0 版,并且在程序运行后我收到了 RuntimeError: Event loop is closed

import asyncio
import aiohttp

async def do_call(name, session):
    async with session.get('https://www.google.be') as response:
        await response.text()
        return 'ok - '.format(name)

async def main():
    async with aiohttp.ClientSession() as session:
        tasks = [do_call(str(i), session) for i in range(0,4)]
        results = await asyncio.gather(*tasks)
        print(results)

asyncio.run(main())

我确实从 asyncio.gather() 获得了有效结果,但是在退出时引发了异常。 我想更改代码,使其不会遇到异常。

回溯如下:

Exception ignored in: <function _ProactorBasePipeTransport.__del__ at 0x000001E9A92079D0>
Traceback (most recent call last):
  File "C:\Users\Jonas\AppData\Local\Programs\Python\Python38\lib\asyncio\proactor_events.py", line 116, in __del__
    self.close()
  File "C:\Users\Jonas\AppData\Local\Programs\Python\Python38\lib\asyncio\proactor_events.py", line 108, in close
    self._loop.call_soon(self._call_connection_lost, None)
  File "C:\Users\Jonas\AppData\Local\Programs\Python\Python38\lib\asyncio\base_events.py", line 711, in call_soon
    self._check_closed()
  File "C:\Users\Jonas\AppData\Local\Programs\Python\Python38\lib\asyncio\base_events.py", line 504, in _check_closed
    raise RuntimeError('Event loop is closed')
RuntimeError: Event loop is closed`

【问题讨论】:

您能否发布 RuntimeError 的完整回溯?这会很有帮助:) 您的示例为我运行而没有错误。是否还有其他与此相关的代码可能导致错误? @PirateNinjas,感谢您的回复。完整的程序发布在这个问题中。我已将回溯添加到问题中。 您使用的是哪个版本的 aiohttp?我有你的代码使用 python=3.8.0 和 aiohttp=3.6.2 @PirateNinjas 我也在使用 3.6.2,在 windows 10 上运行。你在程序结束时遇到异常吗? 【参考方案1】:

我认为这很可能是一个 aiohttp 错误。具体来说,我在他们的github上发现了这个问题:https://github.com/aio-libs/aiohttp/issues/4324

我知道这不一定对您有帮助,但也许您可以切换回去并停止用头撞墙。你的代码很好!

【讨论】:

+1 获取问题的链接:replacing asyncio.run(...) by asyncio.get_event_loop().run_until_complete(...) 为我解决了问题。【参考方案2】:

我用完后不调用my_loop.close() 解决了这个问题。以这种方式关闭事件循环会导致错误被抛出,即使在我得到了我所期望的所有响应之后。

【讨论】:

不幸的是,我认为这不适用于上述问题。提问者使用 asyncio.run 而不是获取事件循环,后者将事件循环闭包包装到其行为中。 IE。使用 run,你永远不会调用 close,所以你不能使用你的答案。

以上是关于异常事件循环在 python 3.8 中使用 aiohttp 和 asyncio 关闭的主要内容,如果未能解决你的问题,请参考以下文章

在 python 3.8 中出现异常的 show_most_informative_features() 错误

PyQt 事件循环和 ipython 中的异常

为啥我在使用 javascript 自动完成时在 Eclipse 中收到消息:“未处理的事件循环异常 Java 堆空间”?

如何使用 Python 3.8 xml.etree 解析 HTML?

用 Python 编写的强大的服务器无限循环

Qt/C++ 事件循环异常处理