首页 文章

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

提问于
浏览
2

正如文件所说,ZMQ套接字are not thread-safe . 所以我假设 Headers 的答案是'No' .

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

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

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

  • 主消息处理循环线程 . 这将在REQ / REP套接字上发出 send() 请求

  • 一个辅助侦听器线程,它将等待来自服务器的响应 . 这将在套接字上使用阻塞 recv() ,并将响应推送到主线程的队列 .

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

1 回答

  • 1

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

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

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

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

相关问题