У меня есть несколько компьютеров в сети, и я пытаюсь скоординировать работу между ними, передавая инструкции и получая ответы от отдельных работников. Когда я использую 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])