ZeroMQ:如何在相同的代码中初始化SUB和PUSH套接字?即黑盒子图案但不使用不同的机器

时间:2013-09-19 07:32:54

标签: zeromq pyzmq

我有这段代码

context = zmq.Context()

app_worker = context.socket(zmq.PUSH)
app_worker.bind("tcp://127.0.0.1:9005")

app_sub = context.socket(zmq.SUB)
app_sub.connect("tcp://127.0.0.1:9004")
app_sub.setsockopt(zmq.SUBSCRIBE,'sometopic')

while True:
    msg = app_sub.recv()
    msg_data = msg.split(' ',1)
    app_worker.send_json(msg_data[1])
    print msg_data[1]

但是当我运行它时,它无法接收来自发布者的任何消息,但是当我评论此行时

app_worker = context.socket(zmq.PUSH)
app_worker.bind("tcp://127.0.0.1:9005")
它突然起作用了。在zeromq指南第5章黑盒图案中说明这是可能的。如果是的话,我在这里做错了什么?

2 个答案:

答案 0 :(得分:0)

您提供的数据不足以100%保证解决此问题。

但是根据您发布的内容,最明显的问题是端口9005已被其他人绑定。

答案 1 :(得分:0)

如果没有下游节点来拉消息,很有可能app_worker.send_json(msg_data[1])正在阻塞(整个线程)。

send_json设置为非阻止模式,并检查返回的错误/异常

app_worker.send_json(msg_data[1], zmq.NOBLOCK)

当您注释掉bind时,它“起作用”的原因是因为发送只是失败而没有阻塞。