首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RuntimeError:事件循环在异步python中是关闭的

RuntimeError:事件循环在异步python中是关闭的
EN

Stack Overflow用户
提问于 2021-02-28 18:17:59
回答 1查看 2.1K关注 0票数 3

我正在尝试使用异步库,但我得到了RuntimeError: Event loop is closed

这是我的代码和回溯。

代码

代码语言:javascript
复制
import asyncio
import asyncpraw

async def main():
    reddit = asyncpraw.Reddit('praw_ini_name')
    print('User is', await reddit.user.me())
    await reddit.close()

asyncio.run(main())

回溯

代码语言:javascript
复制
User is python_user
Exception ignored in: <function _ProactorBasePipeTransport.__del__ at 0x0000021D2898C1F0>
Traceback (most recent call last):
  File "C:\Program Files\Python39\lib\asyncio\proactor_events.py", line 116, in __del__
    self.close()
  File "C:\Program Files\Python39\lib\asyncio\proactor_events.py", line 108, in close
    self._loop.call_soon(self._call_connection_lost, None)
  File "C:\Program Files\Python39\lib\asyncio\base_events.py", line 746, in call_soon
    self._check_closed()
  File "C:\Program Files\Python39\lib\asyncio\base_events.py", line 510, in _check_closed
    raise RuntimeError('Event loop is closed')
RuntimeError: Event loop is closed

但是,如果像这样启动事件循环,则不会发生这种情况(没有异常)。

代码语言:javascript
复制
import asyncio
import asyncpraw

async def main():
    reddit = asyncpraw.Reddit('praw_ini_name')
    print('User is', await reddit.user.me())
    await reddit.close()

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

我的假设是,在较新的python版本中,启动事件循环的首选方法是我在第一个片段中所展示的方式,那么为什么这不起作用呢?即使输出了输出,为什么我的代码会抛出异常呢?

我使用的是Python3.9.2和asyncpraw 7.2.0。

我见过Asyncio事件循环关闭Python3.x RuntimeError:事件循环关闭RuntimeError:事件循环关闭,我相信他们不是傻瓜。我的问题是,为什么它适用于一个,而不是另一个。

如果我不使用reddit.close(),我会得到以下信息

代码语言:javascript
复制
User is python_user
Unclosed client session
client_session: <aiohttp.client.ClientSession object at 0x0000025BAAAEF8B0>
Unclosed connector
connections: ['[(<aiohttp.client_proto.ResponseHandler object at 0x0000025BAAAF1640>, 174448.968)]']
connector: <aiohttp.connector.TCPConnector object at 0x0000025BAAAEFA90>

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-02 18:35:19

asyncio.run显式在完成时关闭循环。

,debug=False) ..。 此函数总是创建一个新的事件循环,并在结束时关闭它。

这意味着一旦main完成,事件循环就无法进行清理。清除必须是决定性的,通过异步生成器,或者同步进行。

当手动管理循环而不调用loop.close()时,循环仍然可用于调度清理回调。请注意,这并不一定意味着清理实际上正在运行,除非显式地恢复循环。

具体而言,问题是关于aiohttp 3.x的已知问题

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66412420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档