使用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 回答
如果底层C API返回
EAGAIN
,Python包装器会引发zmq.error.Again
.现在,您应该按照zmq_send文档说明:
另外,在错误部分:
现在,为什么不能发送任何消息?在描述PUSH/PULL sockets的页面上,我们可以阅读以下关于
PUSH
套接字的内容:在任何对等体连接到套接字之前,无处发送消息,并且没有队列 . 因此,只有两件事是可能的:
如果在阻塞模式下调用
send()
,它会阻塞直到对等连接如果你在非阻塞模式下调用
send()
,它会引发zmq.error.Again
通知你,没有任何关于该消息可以做的事情你应该稍后再试 .请注意,如果每个连接的对等体的队列已满,则也可以获得此异常(
PUSH
套接字为每个连接的对等体创建单独的队列) .