多个套接字会阻止所有套接字工作

时间:2015-06-08 20:17:49

标签: python sockets zeromq

我在网络上有几台计算机,我正在尝试通过广播指令和接收个别工作人员的回复来协调他们之间的工作。当我使用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 个答案:

答案 0 :(得分:1)

嗯,PUB-SUB模式在初始化时(特别是在建立连接时)并不意味着可靠。

您的“主人”在该循环中发布前两条消息,然后等待“工作人员”的请求。现在,如果这些消息丢失(使用PUB-SUB模式发送的第一条消息可能会发生这种情况),那么“工作者”将等待“主”发布。所以,基本上,他们都在等待收到的消息。

除此之外,请注意您正在从“主”节点发布2条消息,而只从“工作者”处理1。你的“工作人员”无法赶上你的“主人”,因此,邮件将被删除或者你将会崩溃。