4

我有一个由 PUSHer 和多个 PULLers 组成的 ZeroMQ 网络。问题是 pullers 的数量是未知的,在某些情况下,它可能是 0。当后者发生时,socket.send(msg) 似乎永远不会返回。如果我没记错的话,PUB/SUB 套接字不会发生这种情况。

当管道的另一侧没有拉拔器时,有什么方法可以避免推送数据包?

谢谢!

4

2 回答 2

8

您可以通过多种方式避免阻塞:

  • 使用 zmq_poll 检查 PUSH 套接字何时准备好输出,只有在准备好时才发送。
  • 使用非阻塞发送(zmq_msg_send 方法上的 ZMQ_DONTWAIT)
  • 在套接字上将发送超时设置为零(ZMQ_SNDTIMEO 套接字选项)并在发送超时时处理错误返回
  • 使用不同的套接字模式,例如 ROUTER-DEALER,从客户端到服务器的信号更明确
于 2012-11-29T04:55:15.880 回答
4

简短回答:PUSH/PULL 和 PUB/SUB 具有不同的语义。

PUSH/PULL 在 pullers 之间分发推送的消息。当你想扇出并确保你的东西得到处理时,你可以使用它。如果没有人在听,那么它将阻塞。

PUB/SUB 将发布的消息广播给所有订阅者。如果没有人在听,那么消息就会丢失。

在我看来,PUB/SUB 更适合您的用例。毕竟,消息丢失的扇出没有任何意义。

于 2012-11-28T23:59:21.823 回答