使Tornado websocket处理程序线程安全

时间:2013-12-31 08:44:37

标签: python multithreading websocket tornado

当我尝试使用Tornado的websocket服务器处理程序从线程写入消息时,我随机获得错误1006((我通过删除TCP连接失败了WebSocket连接)。

我创建了N个线程并将我的ws_handler传递给它们。 但是当我开始使用

self.ws_handler.write_message(jsondata)

对于大量的线程,我一直得到同样的错误。

根据我的理解,1006是在websockets之间跳过'heartbeat'通信时丢弃的TCP连接。我猜这是因为线程并行运行并尝试发送消息。我使用2-3线程测试它,它工作正常,但对于大数量它没有。

我想知道是否有任何方法可以在线程中实现消息发送。(意味着锁由ws_handler内部处理并相应发送)。

我想到的一个解决方案是将 jsondata 推送到队列并让另一个单线程推送消息,但我担心会造成瓶颈。

我的客户是AutobahnPython。

1 个答案:

答案 0 :(得分:5)

Tornado基于单线程事件循环;与Tornado对象的所有交互必须在事件循环的线程上。当您需要将控制权转移回事件循环时,请从另一个线程使用IOLoop.current()。add_callback()。

另见http://www.tornadoweb.org/en/stable/web.html#thread-safety-notes