使用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解释了这面旗帜。
答案 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
套接字为每个连接的对等方创建单独的队列)。