正如文档所述,ZMQ 套接字 are not thread-safe 。所以我认为标题的答案是“否”。
不过,我还是不知道如何实现非阻塞 request-reply使用 ZMQ 的模式:
具体来说,客户端有一个主线程,该线程继续处理来自(线程安全)消息队列的消息。消息来自各种来源,例如网络、定时器、I/O 等。 有时主线程希望向远程服务器发送请求,但不想等待响应(可能需要一段时间才能到达)。
通常,我会使用两个线程:
- 主消息处理循环线程。这将在 REQ/REP 套接字上
send()
请求 - 一个辅助监听器线程,它将等待服务器的响应。这将在套接字上使用阻塞
recv()
,并将响应推送到主线程的队列。
如何使用 ZeroMQ 实现此目的?辅助线程是否应该打开一个 inproc
套接字并监听来自主线程的消息?
最佳答案
其实单线程就够了。只需向服务器发送请求并使用 zmq_poll()
轮询消息即可。
如果一次一个请求就足够了,那么这个模型就很好。如果您需要异步发送多个请求并读取回复,请使用 DEALER 套接字而不是 REQ。只需发送一些 requestId 作为第一帧,然后添加空分隔符帧,然后发送实际请求。
指南的第 3 章提供了有关 REQ/REP 消息信封的更多详细信息:http://zguide.zeromq.org/php:chapter3
如果这还不够清楚,请告诉我,我可能会用一些代码示例来扩展我的答案。
关于multithreading - 我可以在同一个 ZeroMQ REQ/REP 套接字上从一个线程发送()并从另一个线程发送()吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17572759/