【问题标题】:zmq_connect() a socket while waiting for a zmq_send() or zmq_recv()zmq_connect() 一个套接字,同时等待 zmq_send() 或 zmq_recv()
【发布时间】:2015-07-16 16:43:32
【问题描述】:

我正在开发一个应用程序,我想使用 ZeroMQ 连接不同类型的节点,这些节点可以在系统运行时添加和删除。这意味着我想在节点来来去去时随时调用zmq_connect()zmq_disconnect()

一些连接使用ZMQ_REQ 类型的套接字,当没有可用的对等点时阻塞。因此,可能会发生一个节点在 zmq_recv() 中被阻塞,而没有任何节点可用于处理请求。如果那时有一个新节点可用,我想使用 zmq_connect() 连接套接字。我能看到如何做到这一点的唯一方法是从不同的线程调用 zmq_connect() 。但是文档非常清楚地指出,zmq_socket 实例不能同时从多个线程中使用。

我该如何解决这个问题,在ZMQ_REQ 套接字上发送没有任何连接(或无法建立的连接)的消息,然后添加连接并处理等待的请求?

【问题讨论】:

    标签: multithreading zeromq


    【解决方案1】:

    当没有消息准备好时,您不应使用zmq_recv()。这样你就可以避免阻塞你的线程。而是检查是否确实有要接收的消息。实现这一点的最简单方法是使用poller。由于您没有说明您使用的是哪种库或语言,我无法为您提供正确的示例,但我想 ZeroMQ 指南示例here 中的 C 示例可能有用。

    根据我的经验,构建基于 ZeroMQ 的应用程序最有效的方法是构建一个线程节点来响应消息,并在必要时根据时间间隔运行方法。

    对于像你所说的那样构建一个系统,我建议你看看很棒的ZeroMQ GuideService Discovery 章节。

    【讨论】:

    • 很抱歉没有回复您。我在该项目中使用 pyzmq 并尝试使用 poller 和线程之间的本地连接来唤醒 ZMQ 线程,但没有让它可靠地工作。可能我或 pyzmq 搞砸了与全局状态相关的事情。我将很快使用 stdlib 的 asyncio 重做该项目,并且可能只使用 aiozmq 之类的东西,而不会打扰细节。 :)
    猜你喜欢
    • 1970-01-01
    • 2017-06-04
    • 2021-05-23
    • 1970-01-01
    • 2012-01-25
    • 1970-01-01
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多