我有一些简单的python代码,等待主题消息。
但是...运行此程序时,python进程将占用CPU。我知道使用其他语言(例如套接字)时,有一种方法可以等待消息而不会消耗全部处理能力。本质上,线程只是保持暂停以等待响应。 ZeroMQ是否可能?
import zmq
import sys
port = "5556"
if len(sys.argv) > 1:
port = sys.argv[1]
int(port)
# Socket to talk to server
context = zmq.Context()
socket = context.socket(zmq.SUB)
print "Collecting updates from weather server..."
socket.connect ("tcp://localhost:%s" % port)
# Subscribe to zipcode, default is NYC, 10001
topicfilter = "10001"
socket.setsockopt(zmq.SUBSCRIBE, topicfilter)
# Process 5 updates
total_value = 0
for update_nbr in range (5):
string = socket.recv()
topic, messagedata = string.split()
total_value += int(messagedata)
print ('{} {}'.format(topic, message)
Q:“ ZeroMQ可能吗?”
是
上面的代码不是所主张问题的可再现MCVE / MWE表示。
首先:代码显式地阻塞。使用.recv()
方法会阻塞,直到任何新的匹配消息到达为止(如果有的话)。
不会使CPU过载。它只是一直坐在SUB
端等待,直到第一个此类消息(如果有)到达。
如果一个人从未使用过ZeroMQ,在这里可以先研究一下"ZeroMQ - Principles in less than Five Seconds",然后再探讨更多细节
[如果对更好的方案感兴趣,请不要以这种方式使用.recv()
-方法,而应使用POSACK
-方法检测任何此类.poll()
-确认并读取POSACK
-ed的情况使用.recv( zmq.NOBLOCK )
-方法。