tornado - 在龙卷风中使用@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'.
解决方案
您不能IOLoop.add_callback
从另一个线程调用任何 Tornado 方法(除了 )。这包括执行程序创建的线程。调用同步代码时使用执行器;为 Tornado 编写的异步代码不需要它们,我认为没有理由在此代码段中使用它们。
一般来说,最好使用它来IOLoop.run_in_executor
代替@run_on_executor
装饰器,因为它使异步和同步模式之间的转换更加明确。
推荐阅读
- python - Python:为什么函数返回一个字典,其中所有值都由赋值填充?
- java - 使用 java 8 steam 查找两个列表之间的匹配行并映射到另一个对象
- python - 使用 QDesktopService 显示本地 html 文件
- c# - 基于locked bitmap、getpixel和优化辅助函数提高视频校正算法的速度
- matlab - 在没有 fimplicit 或 ezplot 的情况下在 MatLab 中绘制 2 变量隐式函数
- python - Pandas DataFrame - 如何检索 MultiIndex 级别的特定组合
- c - 如何在没有clock_t或定时器的情况下在C中执行时间循环?
- python - 在 Python27 中读取导致 py.test 失败的 top 命令
- tensorflow - 从导出中排除,因为它们无法通过 TensorFlow Serving API 提供服务
- javascript - Gulp babel 任务无法完成