正如文件所说,ZMQ套接字are not thread-safe . 所以我假设 Headers 的答案是'No' .
不过,我无法弄清楚如何使用ZMQ实现非阻塞request-reply模式:
具体来说,客户端有一个主线程,它从(线程安全的)消息队列继续处理其业务处理消息 . 消息来自各种来源,例如网络,定时器,I / O等 . 有时主线程希望向远程服务器发送请求,但它不想等待响应(可能需要一段时间才能到达) .
通常,我会使用两个线程:
-
主消息处理循环线程 . 这将在REQ / REP套接字上发出
send()
请求 -
一个辅助侦听器线程,它将等待来自服务器的响应 . 这将在套接字上使用阻塞
recv()
,并将响应推送到主线程的队列 .
我如何使用ZeroMQ实现这一目标?辅助线程是否应打开 inproc
套接字并侦听来自主线程的消息?
1 回答
实际上,单线程就足够了 . 只需向服务器发送请求并使用
zmq_poll()
轮询消息 .如果一次一个请求足够,那么这个模型就可以了 . 如果您需要这样发送多个请求并异步读取回复,请使用DEALER套接字而不是REQ . 只需发送一些requestId作为第一帧,然后添加空分隔帧,然后发送实际请求 .
指南的第3章有关于REQ / REP消息信封的更多详细信息:http://zguide.zeromq.org/php:chapter3
如果这个不够清楚,请告诉我,我可能会用几个代码示例扩展我的答案 .