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

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


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()

但是当我运行这两个进程时,它没有按预期工作,轮询器脚本不会打印任何内容。这样的实施可能会出现什么问题?


SMILET
浏览 32回答 1
1回答

萧十郎

问:“这样的实施可能会出现什么问题?”.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选项标志,其中合适的 )。自阻塞会使代码失控。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python