zmq send with NOBLOCK raise Resource temporarily unavailable

前端 未结 1 467
花落未央
花落未央 2020-12-30 07:52

This code will raise Resource temporarily unavailable when call with NOBLOCK:

context = zmq.Context()
sender = context.socket(zmq.PUSH)
sender.bind(\'tcp://*         


        
相关标签:
1条回答
  • 2020-12-30 08:23

    Python wrappers raise zmq.error.Again if the underlying C API returns EAGAIN.

    Now, you should follow to zmq_send documentation, which states:

    ZMQ_NOBLOCK
    Specifies that the operation should be performed in non-blocking mode. If the message cannot be queued on the socket, the zmq_send() function shall fail with errno set to EAGAIN.

    Also, in the errors section:

    EAGAIN
    Non-blocking mode was requested and the message cannot be sent at the moment.

    Now, why is it not possible to send any message? On the page describing PUSH/PULL sockets we can read the following about the PUSH socket:

    SHALL create this queue when a peer connects to it. If this peer disconnects, the PUSH socket SHALL destroy its queue and SHALL discard any messages it contains.

    Before any peer connects to your socket, there's nowhere to send the messages, and there's no queue. Thus only 2 things are possible:

    • if you call send() in blocking mode, it blocks until a peer connects
    • if you call send() in non-blocking mode, it raises zmq.error.Again to inform you, that there's nothing that could be done with the message and you should try again later.

    Note, that you can also get this exception if queues for each of the connected peers are full (PUSH socket creates a separate queue for each connected peer).

    0 讨论(0)
提交回复
热议问题