2

正如文档所说,ZMQ 套接字不是线程安全的。所以我假设标题的答案是“不”。

不过,我不知道如何使用 ZMQ实现非阻塞请求-回复模式:

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

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

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

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

4

1 回答 1

2

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

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

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

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

于 2013-07-11T12:26:30.410 回答