在tornado中使用@run_on_executor时,错误是线程';ThreadPoolExecutor-0_0';

在tornado中使用@run_on_executor时,错误是线程';ThreadPoolExecutor-0_0';,tornado,Tornado,我正在处理程序中执行websocket的write_message方法,我将报告一个错误 类测试\u处理程序(BaseHandler): @在执行器上运行 def get(自我): 主机名='Win10' ws=WebSocketHandler.clients[主机名]['self'] ws.write_消息(json.dumps({ “状态”:203,#状态201是为启动机器人 })) 返回self.write({'status':200}) 写入消息中的文件“D:\Anaconda3\li

我正在处理程序中执行websocket的write_message方法,我将报告一个错误

类测试\u处理程序(BaseHandler):
@在执行器上运行
def get(自我):
主机名='Win10'
ws=WebSocketHandler.clients[主机名]['self']
ws.write_消息(json.dumps({
“状态”:203,#状态201是为启动机器人
}))
返回self.write({'status':200})
写入消息中的文件“D:\Anaconda3\lib\site packages\tornado\websocket.py”,第256行 返回self.ws\u connection.write\u消息(消息,二进制=二进制) 文件“D:\Anaconda3\lib\site packages\tornado\websocket.py”,第801行,在write\u消息中 fut=self.\u write\u帧(真、操作码、消息、标志=标志) 文件“D:\Anaconda3\lib\site packages\tornado\websocket.py”,第780行,在写框中 返回self.stream.write(帧) 文件“D:\Anaconda3\lib\site packages\tornado\iostream.py”,第536行,处于写入状态 future=future() 文件“D:\Anaconda3\lib\asyncio\events.py”,第694行,在get\u event\u循环中 返回get_event_loop_policy()。get_event_loop() 文件“D:\Anaconda3\lib\asyncio\events.py”,第602行,在get\u event\u循环中 %threading.current_thread().name) RuntimeError:线程“ThreadPoolExecutor-0\u 0”中没有当前事件循环。
您不能从另一个线程调用任何Tornado方法(除了
IOLoop.add\u callback
)。这包括由执行器创建的线程。调用同步代码时使用执行器;为Tornado编写的异步代码不需要它们,我认为没有理由在这段代码中使用它们


一般来说,最好使用
IOLoop.run\u In\u executor
而不是
@run\u on\u executor
装饰器,因为它使异步和同步模式之间的转换更加明确

确保类
测试处理程序
包含两个成员:

def __init__(self, *args, **kwargs):
    self.executor = tornado.concurrent.futures.ThreadPoolExecutor(...)
    self.io_loop = tornado.ioloop.IOLoop.current()