使 Tornado websocket 处理程序线程安全
Posted
技术标签:
【中文标题】使 Tornado websocket 处理程序线程安全【英文标题】:Making Tornado websocket handler thread safe 【发布时间】:2013-12-31 08:44:36 【问题描述】:尝试使用 Tornado 的 websocket 服务器处理程序从线程写入消息时,我随机收到错误 1006((我通过断开 TCP 连接使 WebSocket 连接失败)。
我创建了 N 个线程并将我的 ws_handler 传递给它们。 但是当我开始使用
self.ws_handler.write_message(jsondata)
对于大量线程,我不断收到相同的错误。
据我了解,1006 是在 websocket 之间跳过“心跳”通信时 TCP 连接断开。我猜这是因为线程并行运行并尝试发送消息。我使用 2-3 个线程对其进行了测试,它工作正常,但对于大量它却没有。
我想知道是否有任何方法可以实现线程内的消息发送。(意味着锁由 ws_handler 在内部处理并相应地发送)。
我正在考虑的一个解决方案是将 jsondata 推送到 队列 并让另一个 单线程 推送消息,但我担心会造成瓶颈。
我的客户是 AutobahnPython。
【问题讨论】:
【参考方案1】:Tornado 基于单线程事件循环;所有与 Tornado 对象的交互都必须在事件循环的线程上。当您需要将控制权转移回事件循环时,请从另一个线程使用 IOLoop.current().add_callback()。
另见http://www.tornadoweb.org/en/stable/web.html#thread-safety-notes
【讨论】:
以上是关于使 Tornado websocket 处理程序线程安全的主要内容,如果未能解决你的问题,请参考以下文章
Tornado websocket 处理程序,self.close() 正在关闭连接而不触发 on_close() 方法
在 Tornado 中保留 websocket 连接列表 [重复]
如何在 Tornado 中创建多个 websocket 聊天?
websocket[tornado] 的单个实例可以处理不同的请求吗?