我有一个调用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()
在使用Python3.7.3的Windows上,不是直接在线程中创建事件循环
我必须:
否则,问题将继续存在。
新线程没有事件循环,因此必须显式传递和设置它:
另外,
p.join()
不会正确终止脚本,因为您从未停止服务器,因此循环将继续运行,可能会挂断线程。在加入线程之前,应该像loop.call_soon_threadsafe(ws.shutdown)
那样调用smth,最好是等待服务器正常关闭。我在线程中运行Bokeh服务器时遇到了这个问题。当我试图创建server=server({'/':app},port=0)时,会得到这个错误。从龙卷风的记录中我发现了。。。
允许在任何线程上创建循环的事件循环策略。 默认的异步事件循环策略仅在主线程中自动创建事件循环。其他线程必须显式创建事件循环,否则asyncio.get_event_loop(因此IOLoop.current)将失败。安装此策略允许在任何线程上自动创建事件循环,与5.0(或Python 2上的5.0)之前的Tornado版本的行为相匹配。
用法:
http://www.tornadoweb.org/en/stable/asyncio.html#tornado.platform.asyncio.AnyThreadEventLoopPolicy
相关问题 更多 >
编程相关推荐