RuntimeError: There is no current event loop in thread 'Thread-1' ,多线程和异步错误

新手上路,请多包涵

我有一个调用 asyncio 循环的线程,但这会导致上述异常:

 RuntimeError: There is no current event loop in thread 'Thread-1'.

这个问题: RuntimeError: There is no current event loop in thread in async + apscheduler 遇到了同样的问题,但是他们引用了我没有的调度程序。

我的代码如下:

 def worker(ws):
      l1 = asyncio.get_event_loop()
      l1.run_until_complete(ws.start())

      l2 = asyncio.get_event_loop()
      l2.run_forever()

if __name__ == '__main__':
    ws = Server()
    p = threading.Thread(target=worker,args=(ws,))
    p.start()

    while True:
        try:
            #...do sth
        except KeyboardInterrupt:
            p.join()
            exit()

原文由 Kev1n91 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.5k
2 个回答

新线程没有事件循环,因此您必须明确传递并设置它:

 def worker(ws, loop):
    asyncio.set_event_loop(loop)
    loop.run_until_complete(ws.start())

if __name__ == '__main__':
    ws = Server()
    loop = asyncio.new_event_loop()
    p = threading.Thread(target=worker, args=(ws, loop,))
    p.start()

此外, p.join() 不会正确终止您的脚本,因为您永远不会停止服务器,因此您的循环将继续运行,可能会挂断线程。在加入线程之前,您应该像 loop.call_soon_threadsafe(ws.shutdown) 一样调用 smth,理想情况下等待服务器正常关闭。

原文由 hoefling 发布,翻译遵循 CC BY-SA 3.0 许可协议

我在线程中运行 Bokeh 服务器时遇到了这个问题。当我尝试创建 server = Server({‘/’: app}, port=0) 时,我会收到此错误。从 Tornado 文档中我发现了以下内容……

 Class tornado.platform.asyncio.AnyThreadEventLoopPolicy[source]

允许在任何线程上创建循环的事件循环策略。默认的 asyncio 事件循环策略只会在主线程中自动创建事件循环。其他线程必须显式创建事件循环,否则 asyncio.get_event_loop(因此 IOLoop.current)将失败。安装此策略允许在任何线程上自动创建事件循环,匹配 Tornado 5.0(或 Python 2 上的 5.0)之前版本的行为。

用法:

 asyncio.set_event_loop_policy(AnyThreadEventLoopPolicy())

http://www.tornadoweb.org/en/stable/asyncio.html#tornado.platform.asyncio.AnyThreadEventLoopPolicy

原文由 joltman 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题