作为 mguijarr 所说的替代方案,您可以在 IOLoop 中将 Tornado 与 zmq 一起使用。
IOLoop 基本上是检查套接字是否可供读取,以及何时调用给定的回调。它在单个线程上运行,但由于它几乎没有浪费时间在“等待”上,它通常更快!
将 tornado 与 ZMQ 一起使用非常简单,因此您所描述的架构可以是这样的:
from zmq.eventloop import zmqstream, ioloop
import tornado.web
from tornado import websocket
class MyBroadcastWebsocket(websocket.WebSocketHandler):
clients = set()
def open(self):
self.clients.add(self)
@classmethod
def broadcast_zmq_message(cls, msg):
for client in cls.clients:
client.write_message('Message:' + str(msg)) # Send the message to all connected clients
def on_close(self):
self.clients.remove(self)
def run():
ioloop.install()
my_stream = zmqstream.ZMQStream(my_zmq_socket) # i.e. a pull socket
my_stream.on_recv(MyBroadcastWebsocket.broadcast_zmq_message) # call this callback whenever there's a message
if __name__ == "__main__":
application = tornado.web.Application([
(r"/websocket", MyBroadcastWebsocket),
])
application.listen(8888)
ioloop.IOLoop.instance()
字面意思就是这样!您可以在zmq或tornado的文档中查看更多信息。