首页 > 解决方案 > 在龙卷风中使用@run_on_executor 时,错误是线程'ThreadPoolExecutor-0_0'中没有当前事件循环

问题描述

我在handler中执行websocket的write_message方法,会报错。

class Test_Handler(BaseHandler):

    @run_on_executor
    def get(self):
        host_name = 'Win10'
        ws = WebSocketHandler.clients[host_name]['self']
        ws.write_message(json.dumps({
            'status': 203,  # 状态201是为启动机器人
        }))
        return self.write({'status': 200})
  File "D:\Anaconda3\lib\site-packages\tornado\websocket.py", line 256, in write_message
    return self.ws_connection.write_message(message, binary=binary)
  File "D:\Anaconda3\lib\site-packages\tornado\websocket.py", line 801, in write_message
    fut = self._write_frame(True, opcode, message, flags=flags)
  File "D:\Anaconda3\lib\site-packages\tornado\websocket.py", line 780, in _write_frame
    return self.stream.write(frame)
  File "D:\Anaconda3\lib\site-packages\tornado\iostream.py", line 536, in write
    future = Future()
  File "D:\Anaconda3\lib\asyncio\events.py", line 694, in get_event_loop
    return get_event_loop_policy().get_event_loop()
  File "D:\Anaconda3\lib\asyncio\events.py", line 602, in get_event_loop
    % threading.current_thread().name)
RuntimeError: There is no current event loop in thread 'ThreadPoolExecutor-0_0'.

标签: tornado

解决方案


您不能IOLoop.add_callback从另一个线程调用任何 Tornado 方法(除了 )。这包括执行程序创建的线程。调用同步代码时使用执行器;为 Tornado 编写的异步代码不需要它们,我认为没有理由在此代码段中使用它们。

一般来说,最好使用它来IOLoop.run_in_executor代替@run_on_executor装饰器,因为它使异步和同步模式之间的转换更加明确。


推荐阅读