RuntimeError: There is no current event loop in thread 'Thread-1' , multithreading and asyncio error
RuntimeError: There is no current event loop in thread 'Thread-1' , multithreading and asyncio error
我有一个调用 asyncio 循环的线程,但这会导致上述异常:
RuntimeError: There is no current event loop in thread 'Thread-1'.
这个问题:遇到了同样的问题,但是他们提到了我没有的调度程序。
我的代码如下:
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()
新线程没有事件循环,所以你必须通过并显式设置它:
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,最好等待服务器正常关闭。
在 Windows 和 Python 3.7.3 上,不是直接在线程中创建事件循环,
我必须:
asyncio.set_event_loop_policy(asyncio.WindowsProactorEventLoopPolicy())
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
否则问题会一直存在
我在线程中的 运行 Bokeh 服务器遇到了这个问题。当我尝试创建 server = Server({'/': app}, port=0) 时,我会收到此错误。从 Tornado 文档中我发现了以下内容...
Class tornado.platform.asyncio.AnyThreadEventLoopPolicy[source]
允许在任何线程上创建循环的事件循环策略。
默认的 asyncio 事件循环策略只会在主线程中自动创建事件循环。其他线程必须显式创建事件循环,否则 asyncio.get_event_loop(因此 IOLoop.current)将失败。安装此策略允许在任何线程上自动创建事件循环,与 5.0 之前的 Tornado 版本(或 Python 2 上的 5.0)的行为相匹配。
用法:
asyncio.set_event_loop_policy(AnyThreadEventLoopPolicy())
http://www.tornadoweb.org/en/stable/asyncio.html#tornado.platform.asyncio.AnyThreadEventLoopPolicy
我有一个调用 asyncio 循环的线程,但这会导致上述异常:
RuntimeError: There is no current event loop in thread 'Thread-1'.
这个问题:
我的代码如下:
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()
新线程没有事件循环,所以你必须通过并显式设置它:
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,最好等待服务器正常关闭。
在 Windows 和 Python 3.7.3 上,不是直接在线程中创建事件循环,
我必须:
asyncio.set_event_loop_policy(asyncio.WindowsProactorEventLoopPolicy())
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
否则问题会一直存在
我在线程中的 运行 Bokeh 服务器遇到了这个问题。当我尝试创建 server = Server({'/': app}, port=0) 时,我会收到此错误。从 Tornado 文档中我发现了以下内容...
Class tornado.platform.asyncio.AnyThreadEventLoopPolicy[source]
允许在任何线程上创建循环的事件循环策略。 默认的 asyncio 事件循环策略只会在主线程中自动创建事件循环。其他线程必须显式创建事件循环,否则 asyncio.get_event_loop(因此 IOLoop.current)将失败。安装此策略允许在任何线程上自动创建事件循环,与 5.0 之前的 Tornado 版本(或 Python 2 上的 5.0)的行为相匹配。
用法:
asyncio.set_event_loop_policy(AnyThreadEventLoopPolicy())
http://www.tornadoweb.org/en/stable/asyncio.html#tornado.platform.asyncio.AnyThreadEventLoopPolicy