我在网络上有几台计算机,我正在尝试通过广播指令和接收个别工作人员的回复来协调他们之间的工作。当我使用zmq为每个程序分配一个套接字时它工作正常,但是当我尝试分配另一个时,它们都不起作用。例如,主程序在一台机器上运行。使用这样的代码它作为发布者工作正常,但是当我取消注释注释行时,套接字都不起作用。我已经看到示例代码非常类似于此,所以我认为它应该可以工作,但我必须遗漏一些东西。
这是一些示例代码,首先是主程序,然后是工作程序。我们的想法是根据从工人到主人的输入来控制主人的工作程序。
import zmq
import time
import sys
def master():
word = sys.argv[1]
numWord = sys.argv[2]
port1 = int(sys.argv[3])
port2 = int(sys.argv[4])
context = zmq.Context()
publisher = context.socket(zmq.PUB)
publisher.bind("tcp://*:%s" % port1)
#receiver = context.socket(zmq.REP)
#receiver.bind("tcp://*:%s" % port2)
for i in range(int(numWord)):
print str(i)+": "+word
print "Publishing 1"
publisher.send("READY_FOR_NEXT_WORD")
print "Publishing 2"
publisher.send(word)
#print "Published. Waiting for REQ"
#word = receiver.recv()
#receiver.send("Master IRO")
time.sleep(1)
print "Received: "+word
publisher.send("EXIT_NOW")
master()
同样的工人:
import zmq
import random
import zipfile
import sys
def worker(workerID, fileFirst, fileLast):
print "Worker "+ str(workerID) + " started"
port1 = int(sys.argv[4])
port2 = int(sys.argv[5])
# Socket to talk to server
context = zmq.Context()
#pusher = context.socket(zmq.REQ)
#pusher.connect("tcp://10.122.102.45:%s" % port2)
receiver = context.socket(zmq.SUB)
receiver.connect ("tcp://10.122.102.45:%s" % port1)
receiver.setsockopt(zmq.SUBSCRIBE, '')
found = False
done = False
while True:
print "Ready to receive"
word = receiver.recv()
print "Received order: "+word
#pusher.send("Worker #"+str(workerID)+" IRO "+ word)
#pusher.recv()
#print "Confirmed receipt"
worker(sys.argv[1], sys.argv[2], sys.argv[3])
答案 0 :(得分:1)
嗯,PUB-SUB
模式在初始化时(特别是在建立连接时)并不意味着可靠。
您的“主人”在该循环中发布前两条消息,然后等待“工作人员”的请求。现在,如果这些消息丢失(使用PUB-SUB
模式发送的第一条消息可能会发生这种情况),那么“工作者”将等待“主”发布。所以,基本上,他们都在等待收到的消息。
除此之外,请注意您正在从“主”节点发布2条消息,而只从“工作者”处理1。你的“工作人员”无法赶上你的“主人”,因此,邮件将被删除或者你将会崩溃。