【问题标题】:asyncio.run RuntimeError: Event loop is closedasyncio.run RuntimeError:事件循环已关闭
【发布时间】:2020-08-15 23:56:18
【问题描述】:
import robloxapi, asyncio
client = robloxapi.Client(".ROBLOSECURITY Cookie Here") # Removed this for security reasons

async def main():
    user = await client.get_self()

    try:
        role = await user.get_role_in_group(1)
    except robloxapi.utils.errors.NotFound:
        role = None

    if role:    
        print(role.name)
    else:
        print("Not in group")

asyncio.run(main())

这段代码引发了RuntimeError: Event loop is closed,我不知道为什么,

我试过用这个替换 asyncio.run

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

但它给了我同样的错误

【问题讨论】:

  • 可能重复? stackoverflow.com/questions/45600579/… 。我没有标记
  • 不,这似乎并没有改变任何东西我仍然有同样的错误,此外,在他们提到的 cmets 中,当你使用 asyncio.run 时默认情况下它具有这种行为
  • 我最终在 WSL 中运行它并且完全相同的代码工作
  • @Filip,我正在写一个关于前摄器和选择器事件循环的一般答案,以帮助这里的一些人。我想知道我的回答对你有帮助吗?可以给点意见吗?

标签: python runtime-error python-asyncio roblox event-loop


【解决方案1】:

在 Windows 上执行此操作:

asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
asyncio.run(main())

【讨论】:

    【解决方案2】:

    我是 StackOverflow 的新手,我不会写 cmets。我会在这里写它作为答案。我在使用 asyncio 时遇到了类似的问题。

    所以我遇到的问题通过更改 Python 使用的 Eventloop 得到了解决。

    在低于 3.8 的 python 版本中: - 在 Windows 上使用 SelectorEventLoop - 在 Linux 上使用 ProactorEventLoop。

    (在 python 3.8+ 中它们都是 ProactorEventLoop)所以如果你安装了 python 3.8+,这对你没有帮助。因为你将在 Windows 上拥有与 WSL 上相同的事件循环。

    如果你的 python 版本低于 3.8- 这可能会对你有所帮助。

    所以你可以尝试手动设置 ProactorEventLoop,当你使用 WSL 时也会使用它

    asyncio.set_event_loop(asyncio.ProactorEventLoop())
    
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())
    loop.close()
    

    希望这些信息对您有所帮助。

    【讨论】:

      【解决方案3】:

      好的,我最近发现了如何执行此操作,因为我遇到了 HELLA 解决此问题的问题。我在这里找到了这个答案,但这些都不适合我。这篇关于 PythonAlgos 的 RuntimeError: Event loop closed error 的帖子很好地解释了这一点。如果您只想复制和粘贴,这里是代码:

      from functools import wraps
      
      
      from asyncio.proactor_events import _ProactorBasePipeTransport
       
      def silence_event_loop_closed(func):
          @wraps(func)
          def wrapper(self, *args, **kwargs):
              try:
                  return func(self, *args, **kwargs)
              except RuntimeError as e:
                  if str(e) != 'Event loop is closed':
                      raise
          return wrapper
       
      _ProactorBasePipeTransport.__del__ = silence_event_loop_closed(_ProactorBasePipeTransport.__del__)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-04
        • 1970-01-01
        • 2022-07-15
        • 2022-10-06
        相关资源
        最近更新 更多