我可以在同一个ZeroMQ REQ / REP Socket上从一个线程发送()并从另一个线程发送recv()吗?

时间:2013-07-10 14:04:26

标签: multithreading zeromq

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

但是,我无法弄清楚如何使用ZMQ实现非阻塞request-reply模式:

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

指南第3章详细介绍了REQ / REP信息封套:http://zguide.zeromq.org/php:chapter3

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