ZMQ PUSHer没有PULLer

时间:2012-11-28 22:51:16

标签: zeromq

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

当管道的另一侧没有拉出器时,有没有办法避免推包?

谢谢!

2 个答案:

答案 0 :(得分:8)

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

  • 使用zmq_poll检查PUSH套接字何时准备输出,并仅在准备就绪时发送。
  • 使用非阻塞发送(zmq_msg_send方法上的ZMQ_DONTWAIT)
  • 在套接字上设置发送超时为零(ZMQ_SNDTIMEO套接字选项)并在发送超时时处理错误返回
  • 使用不同的套接字模式,例如ROUTER-DEALER,从客户端到服务器的更明确的信令

答案 1 :(得分:4)

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

PUSH / PULL在拉出器之间分配推送的消息。当你想要散开并确保你的东西得到处理时,你可以使用它。如果没有人在听,那就会阻止。

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

听起来像PUB / SUB更适合您的用例。消息丢失的扇出终究没有任何意义。