2013-07-10 18 views
2

正如文件所说,ZMQ插座are not thread-safe。所以我认为标题的答案是'不'。我可以从同一个ZeroMQ REQ/REP套接字的一个线程发送()和另一个线程的recv()吗?

不过,我无法弄清楚如何使用来实现无阻塞request-reply模式ZMQ:

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

通常情况下,我会用两个线程:

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

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

回答

1

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

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

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

请让我知道这是不够清楚,我可能会延长我的答案与一些代码样本。

+0

Thanks @Wildfire。我一次可以保证一个请求,所以我不会违反request-reply-request-reply命令。但是,我想要主线程发送请求,并让侦听器线程等待它。这是一个非常常见的模式,但它需要两个线程来访问套接字 - 主要发送(),监听器将recv() – bavaza

+0

@bavaza但是,您必须在同一个线程上调用send()和recv()。如果您想在另一个线程上recv(),那么最简单的方法就是调用send()。 – Wildfire

相关问题