multithreading - 我可以在同一个 ZeroMQ REQ/REP 套接字上从一个线程发送()并从另一个线程发送()吗?

标签 multithreading zeromq

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

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

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

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

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

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

最佳答案

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

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

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

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

关于multithreading - 我可以在同一个 ZeroMQ REQ/REP 套接字上从一个线程发送()并从另一个线程发送()吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17572759/

相关文章:

c# - 如何等待嵌套任务?

java - java中的自定义线程池实现

c++ - 如何使用新的套接字类型扩展 ZeroMQ?

asp.net-mvc - 即使禁用 session ,ASP.NET MVC 5 并发请求也会排队

multithreading - 在 Rust 中使用 `Result<T, Box<dyn Error>>` 技巧,但跨多个线程

c - #define PI_THREAD(X) void *X (void *dummy)

Akka 聚类冲突

c++ - zmq 在清理期间卡在 zmq_proxy()

php - Xampp 上的 ZMQ (Windows)

linux - redhat 4.1安装zeromq报错