2015-06-08 69 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。你的“工作人员”将无法赶上你的“主人”,因此,邮件将被丢弃,否则你将会崩溃。