RuntimeError:线程“ Thread-1”,多线程和异步错误中没有当前事件循环

Kev*_*n91 6 python multithreading python-asyncio

我有一个调用asyncio循环的线程,但是这导致了所提到的异常:

RuntimeError: There is no current event loop in thread 'Thread-1'.
Run Code Online (Sandbox Code Playgroud)

这个问题:RuntimeError:异步+ 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() 
Run Code Online (Sandbox Code Playgroud)

hoe*_*ing 10

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

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()
Run Code Online (Sandbox Code Playgroud)

另外,p.join()由于永远不会停止服务器,因此不会正确终止脚本,因此循环将继续运行,可能会挂起线程。您应该像loop.call_soon_threadsafe(ws.shutdown)加入线程之前那样调用smth ,最好是等待服务器正常关闭。

  • 最好使用`asyncio.new_event_loop`在`worker`中分配一个新的事件循环,并将其设置为worker线程。如图所示,将主线程的事件循环传递给工作程序,可能会导致两个线程尝试共享同一事件循环实例,这将导致意外失败。当然,上面的代码片段没有这个问题,但是在较大的代码库中,很容易想象有人试图例如从主线程向事件循环提交某些东西,尤其是当循环继续由主线程返回时线程对`asyncio.get_event_loop()`的调用。 (4认同)