2015-06-08 124 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模式並不意味着是可靠專門的初始化(而建立連接)。

你的「主」發表在循環中的第2個消息,然後等待來自「工人」的請求。現在,如果這些消息丟失(與PUB-SUB模式發送的第一條消息可能發生的事情),那麼「工作人員」將被卡住等待來自「主」的發佈。所以,基本上,他們都在等待傳入的消息。

除此之外,請注意,您是從「主」節點發布2個消息,而只從「工人」處理1。你的「工作人員」將無法趕上你的「主人」,因此,郵件將被丟棄,否則你將會崩潰。