zmq发送NOBLOCK引发资源暂时不可用

时间:2014-02-17 10:22:14

标签: sockets zeromq pyzmq

使用NOBLOCK调用时,此代码将使资源暂时不可用:

context = zmq.Context()
sender = context.socket(zmq.PUSH)
sender.bind('tcp://*:15556')
sender.send('KeEpAliv', zmq.NOBLOCK)  # this line will throw exception
#sender.send('KeEpAliv')  # this line will ok

阅读docs后,我没有找到任何提示。但docs for recv解释了这面旗帜。

1 个答案:

答案 0 :(得分:13)

如果底层C API返回zmq.error.Again,则Python包装器会引发EAGAIN

现在,您应该遵循zmq_send文档,其中声明:

  

ZMQ_NOBLOCK
  指定应在中执行操作   非阻塞模式。如果消息无法在套接字上排队,则   当errno设置为EAGAIN时,zmq_send()函数将失败。

另外,在错误部分:

  

EAGAIN
  请求了非阻止模式,此时无法发送消息。

现在,为什么不能发送任何消息?在描述PUSH/PULL sockets的页面上,我们可以阅读以下有关PUSH套接字的信息:

  

当对等体连接到该队列时,应该创建此队列。如果此对等方断开连接,   PUSH套接字应该破坏其队列,并且应该丢弃它包含的任何消息。

在任何对等体连接到套接字之前,无处发送消息,并且没有队列。因此,只有两件事是可能的:

  • 如果您在阻止模式下调用send(),它会阻塞,直到对等连接
  • 如果您以非阻止模式致电send(),则会引发zmq.error.Again通知您,该消息无法解决,您应该稍后再试。

请注意,如果每个连接的对等方的队列已满,您也可以获得此异常(PUSH套接字为每个连接的对等方创建单独的队列)。