【问题标题】:Can I send() from one thread and recv() from another on the same ZeroMQ REQ/REP Socket?我可以在同一个 ZeroMQ REQ/REP 套接字上从一个线程发送()并从另一个线程发送 recv()吗?
【发布时间】:2023-03-03 16:07:01
【问题描述】:

正如文档所说,ZMQ 套接字 are not thread-safe。所以我假设标题的答案是“否”。

不过,我还是不知道如何使用 ZMQ 实现非阻塞 request-reply 模式:

具体来说,客户端有一个主线程,它继续处理来自(线程安全)消息队列的消息。消息来自各种来源,例如网络、定时器、I/O 等。 有时主线程希望向远程服务器发送请求,但它不想等待响应(可能需要一段时间才能到达)。

通常,我会使用两个线程:

  1. 主消息处理循环线程。这将在 REQ/REP 套接字上 send() 请求
  2. 将等待来自服务器的响应的辅助侦听器线程。这将在套接字上使用阻塞 recv(),并将响应推送到主线程的队列。

我将如何使用 ZeroMQ 实现这一目标?辅助线程是否应该打开一个inproc套接字并监听来自主线程的消息?

【问题讨论】:

    标签: multithreading zeromq


    【解决方案1】:

    其实单线程就够了。只需向服务器发送请求并使用zmq_poll() 轮询消息。

    如果一次一个请求就足够了,则此模型很好。如果您需要这样发送多个请求并异步读取回复,请使用 DEALER 套接字而不是 REQ。只需发送一些 requestId 作为第一帧,然后添加空分隔符帧,然后发送实际请求。

    指南的第 3 章有更多关于 REQ/REP 消息信封的详细信息:http://zguide.zeromq.org/php:chapter3

    如果这还不够清楚,请告诉我,我可能会用几个代码示例来扩展我的答案。

    【讨论】:

    • 谢谢@Wildfire。我可以保证一次一个请求,所以我不会违反请求-回复-请求-回复的顺序。但是,我希望主线程发送请求,并让侦听器线程等待它。这是一个非常常见的模式,但它需要两个线程都访问套接字 - 主线程将 send(),侦听器将 recv()
    • @bavaza 不过,您必须在同一个线程上调用 send() 和 recv()。如果你想在另一个线程上调用 recv(),那么最简单的方法就是在它上面调用 send()。
    • @Wildfire 还有,不要忘记 ZMQ 会为您处理消息队列,因此如果您“同步”执行,您不会阻止消息进入。
    猜你喜欢
    • 2014-11-19
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多