首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么ZeroMQ poller没有接收消息(python)?

为什么ZeroMQ poller没有接收消息(python)?
EN

Stack Overflow用户
提问于 2020-10-30 12:55:54
回答 1查看 664关注 0票数 1

我试图在python中使用带有两个套接字的ZeroMQ Poller()功能:

代码语言:javascript
复制
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的服务器描述为:

代码语言:javascript
复制
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()

但是,当我运行这两个进程时,它不像预期的那样工作,轮询脚本不会打印任何内容。这样的执行会有什么问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-31 16:01:16

Q:“这样的实现会有什么问题?”

  • 这样的实现很容易出现死锁&由于只使用.poll() & .recv()方法

的阻塞形式而失败。

  • 这样的实现在多个对等点被连接到AccessPoints的情况下,实现了循环输入/输出流量映射

的情况下,是不够自卫的。

  • 这样的实现是非常错误的,在只调用单个.recv()的情况下,如果.send_multipart()发出了惊人的警告,那么就会出现多部分的消息处理所需的

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

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

  • 最后但并非最不重要的一点是,下一次试图将.bind()放到同一个ipc://传输类目标上的任何尝试都将悄悄地将您预定的ROUTER-access摧毁到消息/信令平面基础结构&您的实现已经花费了零的努力来自我保护和自我诊断错误,这些错误可能会悄悄地出现在“窗帘后面”

上。

不应该自动处理死锁吗?如果不能同时使用.poll()和recv(),应该如何使用ZMQ结构?- hao123

No

ZeroMQ zen- of -0是以性能+低延迟为重点的,因此请考虑对阻塞预防的所有适当的注意应该掌握在您自己的手中(根据需要&在需要的地方,为了实现几乎线性的可伸缩性能的目标,核心库永远不会比需要的步骤多一个步骤)。

No,

自由使用.poll()-和.recv()-methods,但完成它以适应非阻塞方式--.poll()& add活动检测+多部分消息的处理(同样,最好使用非阻塞方式,在适当的情况下使用zmq.NOBLOCK选项标志)。自我阻塞会使代码失控。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64608767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档