我正在尝试使用asyncpraw库,但得到了RuntimeError: Event loop is closed
。
这是我的代码和回溯。
代码
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())
追溯
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
但是,如果我像这样启动事件循环,则不会发生(无例外)
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版本中,启动事件循环的首选方法是我在第一个代码段中所示的方法,那么为什么这不起作用?即使输出输出,为什么我的代码也会引发异常?
我使用的是Python 3.9.2和asyncpraw
7.2.0。
我已经看到Asyncio事件循环已关闭,Python3.x RuntimeError:事件循环已关闭,而Aiohttp,Asyncio:RuntimeError:事件循环已关闭,我相信它们不是伪造的。我的问题问为什么它只能与另一只一起使用。
如果我不使用,reddit.close()
则会得到以下信息
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>
谢谢你。
asyncio.run
显式关闭完成时的循环。
asyncio.run(coro,*,debug = False)
[...]
此函数始终创建一个新的事件循环,并在最后将其关闭。
这意味着一旦完成,事件循环将不可用于清理main
。相反,必须通过异步生成器或同步地确定性地进行清理。
当手动管理循环而不调用时loop.close()
,循环仍可用于安排清理回调。请注意,除非明确恢复循环,否则这并不一定意味着实际上会执行清除操作。
具体来说,该问题是aiohttp 3.x的一个已知问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句