首页 文章

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

提问于
浏览
5

使用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 回答

  • 10

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

    现在,您应该按照zmq_send文档说明:

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

    另外,在错误部分:

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

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

    当对等体连接到该队列时,应该创建此队列 . 如果此对等设备断开连接,则PUSH套接字应该销毁其队列,并且应该丢弃它包含的任何消息 .

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

    • 如果在阻塞模式下调用 send() ,它会阻塞直到对等连接

    • 如果你在非阻塞模式下调用 send() ,它会引发 zmq.error.Again 通知你,没有任何关于该消息可以做的事情你应该稍后再试 .

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

相关问题