1

我有这个代码

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章黑盒模式中指出这是可能的。如果是这样,我在这里做错了什么?

4

2 回答 2

0

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

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

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

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

于 2019-06-12T08:55:01.863 回答
0

您没有提供足够的数据来 100% 保证解决这个问题。

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

于 2019-06-12T06:46:10.607 回答