使 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] 的单个实例可以处理不同的请求吗?

WebSocket Handler on_close 方法 async 实现tornado

Tornado——异步,websocket