使Tornado websocket处理程序线程安全

cra*_*div 2 python multithreading tornado websocket

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

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

self.ws_handler.write_message(jsondata)
Run Code Online (Sandbox Code Playgroud)

对于大量的线程,我不断得到同样的错误.

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

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

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

我的客户是AutobahnPython.

Ben*_*ell 5

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

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