我创建了一个单独运行的zmq_forwarder.py
,它将消息从应用程序传递到sockJS连接,我现在正在研究一个烧瓶应用程序如何通过zmq从sockJS接收消息。我正在粘贴zmq_forwarder.py
的内容。我是ZMQ的新手,我不知道为什么每次运行它都会使用100%的CPU负载。
import zmq
# Prepare our context and sockets
context = zmq.Context()
receiver_from_server = context.socket(zmq.PULL)
receiver_from_server.bind("tcp://*:5561")
forwarder_to_server = context.socket(zmq.PUSH)
forwarder_to_server.bind("tcp://*:5562")
receiver_from_websocket = context.socket(zmq.PULL)
receiver_from_websocket.bind("tcp://*:5563")
forwarder_to_websocket = context.socket(zmq.PUSH)
forwarder_to_websocket.bind("tcp://*:5564")
# Process messages from both sockets
# We prioritize traffic from the server
while True:
# forward messages from the server
while True:
try:
message = receiver_from_server.recv(zmq.DONTWAIT)
except zmq.Again:
break
print "Received from server: ", message
forwarder_to_websocket.send_string(message)
# forward messages from the websocket
while True:
try:
message = receiver_from_websocket.recv(zmq.DONTWAIT)
except zmq.Again:
break
print "Received from websocket: ", message
forwarder_to_server.send_string(message)
如你所见,我设置了4个插座。应用程序连接到端口5561以将数据推送到zmq,并将端口5562连接到zmq(尽管我仍在计算如何实际设置它以侦听zmq发送的消息)。另一方面,sockjs从端口5564上的zmq接收数据,并在端口5563上向其发送数据。
我已经阅读zmq.DONTWAIT
接收消息异步和非阻塞,所以我添加了它。
有没有办法改进代码,以便我不会超载CPU?目标是能够使用zmq在flask应用程序和websocket之间传递消息。
答案 0 :(得分:5)
您正在紧密循环中轮询您的两个接收器插槽,没有任何阻塞(zmq.DONTWAIT
),这将不可避免地最大化CPU。
请注意,ZMQ支持在单个线程中轮询多个套接字 - 请参阅this answer。我认为您可以在poller.poll(millis)
中调整超时,以便在有大量传入消息的情况下,您的代码仅使用大量CPU,否则会使用空闲。
您的另一个选择是使用ZMQ事件循环使用回调异步响应传入消息。请参阅本主题的PyZMQ documentation,其中包含以下“echo”示例:
# set up the socket, and a stream wrapped around the socket
s = ctx.socket(zmq.REP)
s.bind('tcp://localhost:12345')
stream = ZMQStream(s)
# Define a callback to handle incoming messages
def echo(msg):
# in this case, just echo the message back again
stream.send_multipart(msg)
# register the callback
stream.on_recv(echo)
# start the ioloop to start waiting for messages
ioloop.IOLoop.instance().start()