正如文件所说,ZMQ插座are not thread-safe。所以我认为标题的答案是'不'。我可以从同一个ZeroMQ REQ/REP套接字的一个线程发送()和另一个线程的recv()吗?
不过,我无法弄清楚如何使用来实现无阻塞request-reply模式ZMQ:
具体而言,客户端有一个主线程肚里关于其业务处理的消息从(线程安全)消息队列。消息来自各种来源,如网络,定时器,I/O等。 偶尔主线程希望向远程服务器发送请求,但不希望等待响应(这可能需要一段时间到达)。
通常情况下,我会用两个线程:
- 主要消息处理循环线程。这将在REQ/REP套接字上请求
send()
- 一个辅助侦听器线程,它将等待来自服务器的响应。这将在套接字上使用阻止
recv()
,并将响应推送到主线程队列。
如何使用ZeroMQ实现这一目标?辅助线程是否应打开一个inproc
套接字并收听来自主线程的消息?
Thanks @Wildfire。我一次可以保证一个请求,所以我不会违反request-reply-request-reply命令。但是,我想要主线程发送请求,并让侦听器线程等待它。这是一个非常常见的模式,但它需要两个线程来访问套接字 - 主要发送(),监听器将recv() – bavaza
@bavaza但是,您必须在同一个线程上调用send()和recv()。如果您想在另一个线程上recv(),那么最简单的方法就是调用send()。 – Wildfire