2015-06-08 3 views
1

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

ответ

1

Ну, PUB-SUB модели не предназначены для надежной специально инициализации (в то время как соединение установлено).

Ваш «мастер» публикует первые два сообщения в этом цикле, а затем ждет запроса от «рабочего». Теперь, если эти сообщения будут потеряны (что-то, что может случиться с первыми сообщениями, отправленными с шаблонами PUB-SUB), тогда «рабочий» застрянет в ожидании публикации от «мастера». Итак, в основном, они оба застревают в ожидании входящего сообщения.

Кроме того, обратите внимание, что вы публикуете 2 сообщения с «ведущего» узла, а только обрабатываете 1 из «рабочего». Ваш «рабочий» не сможет догнать вашего «хозяина», и поэтому сообщения будут удалены или вы получите сбой.

Смежные вопросы