为什么 ZeroMQ 轮询器不接收消息 (python)?

Why is ZeroMQ poller not receiving messages (python)?

我正在尝试将 ZeroMQ Poller() 功能与 python 中的两个套接字一起使用:

import zmq

# Prepare our context and sockets
context = zmq.Context()

receiver = context.socket(zmq.DEALER)
receiver.connect("ipc:///tmp/interface-transducer")

subscriber = context.socket(zmq.SUB)
subscriber.bind("ipc:///tmp/fast-service")
subscriber.setsockopt(zmq.SUBSCRIBE, b"10001")

# Initialize poll set
poller = zmq.Poller()
poller.register(receiver, zmq.POLLIN)
poller.register(subscriber, zmq.POLLIN)

# Process messages from both sockets
while True:
    try:
        socks = dict(poller.poll())
    except KeyboardInterrupt:
        break

    if receiver in socks:
        message = receiver.recv()
        print("RECEIVER OK\n")

    if subscriber in socks:
        message = subscriber.recv()
        print("SUBSCRIBER OK\n")

然后作为 ROUTER 发送消息的服务器被描述为:

def main():
    context = zmq.Context()
    router = context.socket(zmq.ROUTER)
    router.bind("ipc:///tmp/interface-transducer")
    while True:
        identity = b'electrode-service'
        b_identity = identity
        router.send_multipart([b_identity, b'[1,2]'])
        print("Sent")
        time.sleep(1)

if __name__ == "__main__":
    main()

但是当我运行这两个进程时,它没有按预期工作,poller-script 没有打印任何东西。这样的实现可能有什么问题?

Q : "What could be the problem of such implementation?"

  • 由于只使用 .poll().recv() 的 blocking-forms 方法

    ,因此这种实现容易出现死锁和失败
  • 在多个对等点连接到 AccessPoints 的情况下,这种实施方式 self-defending 是不够的,实施 round-robin incoming/outgoing 流量映射

  • 在 self-blinded 只调用一个 .recv() 的情况下,这样的实现是非常错误的,在 .send_multipart() 明显警告的情况下,会有 multi-part message-handling 需要

  • ipc://传输Class容易隐藏O/S相关user-level代码限制(操作系统对格式和长度的设置一个路径名和有效的 user-rights 到 R/W/X )

  • ipc:// 传输 Class .connect()-方法的用途是 order-dependent 对于 target-address 尚未由 O/S 服务(需要先成功 .bind()

  • 最后但并非最不重要的一点是,任何下一次尝试 .bind() 进入同一个 ipc:// 运输 Class 目标都会悄无声息地摧毁你想要的 ROUTER-访问 messaging/signalling-plane 基础架构并且您的实施花费了 zero-efforts 到 self-protect 和 self-diagnose 错误,这些错误可能会悄悄地出现在“幕后”

Shouldn't zeromq deal automatically with deadlocks? I tried using the example given in the zeromq guide mspoller If I can't use .poll() and recv() simultaneously, how should I use ZMQ Poller structure? – hao123

No,
ZeroMQ zen-of-zero 专注于性能 + low-latency,因此请考虑对 blocking-prevention 的所有应有注意掌握在你自己手中(根据需要和在需要的地方,核心库永远不会比实现几乎线性可扩展性能的目标所需的步骤多一步)。

不,
自由使用 .poll()- 和 .recv()- 方法,但要完成它以适应 non-blocking 时尚 - .poll( 0 ) 并添加主动检测 + 处理 multi-part 消息(同样,最好采用 non-blocking 时尚,使用 zmq.NOBLOCK option flag where appropriate ). Self-blocking 代码失控。