为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

SMILET 2024-01-27 14:39:46
我正在尝试在 python 中使用Poller()带有两个套接字的 ZeroMQ 功能:import zmq# Prepare our context and socketscontext = 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 setpoller = zmq.Poller()poller.register(receiver, zmq.POLLIN)poller.register(subscriber, zmq.POLLIN)# Process messages from both socketswhile 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()但是当我运行这两个进程时,它没有按预期工作,轮询器脚本不会打印任何内容。这样的实施可能会出现什么问题?
查看完整描述

1 回答

?
萧十郎

TA贡献1815条经验 获得超12个赞

“这样的实施可能会出现什么问题?”

  • .poll()由于仅使用&.recv()方法的阻塞形式,这种实现很容易出现死锁并失败

  • 在多个对等点连接到实现循环传入/传出流量映射的接入点的情况下,这种实现的自我防御能力不够

  • .recv()这种实现方式是非常错误的,因为在这种情况下,只调用一个单独的代码.send_multipart()是非常错误的,在这种情况下,会发出惊人的警告,需要进行多部分消息处理

  • ipc://Transport Class 很容易隐藏与操作系统相关的用户级代码限制(由操作系统对路径名的格式和长度以及对 R/W/X 的有效用户权限进行设置)

  • ipc://对于 O/S 服务尚未创建目标地址的情况,传输类.connect()方法的使用取决于顺序(.bind()需要首先成功)

  • 最后但并非最不重要的一点是,任何.bind()对同一ipc://传输类目标的下一次尝试都会默默地破坏您ROUTER对消息传递/信令平面基础设施的预期访问,并且您的实现已经花费了零努力来自我保护和自我诊断错误,这些错误可能会默默地发生出现在“幕后”

Zeromq 不应该自动处理死锁吗?我尝试使用zeromq指南mspoller中给出的示例如果我不能同时使用.poll()和recv(),我应该如何使用ZMQ Poller结构?– hao123


ZeroMQ zen-of-zero 注重性能+低延迟,因此请考虑将预防阻塞的所有应有注意都掌握在您自己的手中(根据需要和需要的地方,核心库永远不会比实现几乎线性可扩展性能的目标所需的)。

不,
自由使用.poll()- 和 -.recv()方法,但完成它以适应非阻塞方式 -.poll( 0 )并添加主动检测+多部分消息的处理(再次,最好以非阻塞方式,使用zmq.NOBLOCK选项标志,其中合适的 )。自阻塞会使代码失控。


查看完整回答
反对 回复 2024-01-27
  • 1 回答
  • 0 关注
  • 25 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信