[zeromq-dev] Why socket.send will block without consumer

Justin Karneges justin at affinix.com
Wed Mar 20 07:38:22 CET 2013


On Wednesday, March 20, 2013 12:14:09 PM He Jie Xu wrote:
> Hi, all
> 
> I try zeromq with following code:
> 
> import zmq
> import random
> import time
> 
> context = zmq.Context()
> socket = context.socket(zmq.PUSH)
> socket.bind("ipc://test.sock")
> socket.setsockopt(zmq.HWM, 1000)
> while True:
>     zipcode = random.randrange(1, 100000)
>     temperature = random.randrange(1, 215)
>     message = "%d %d" % (zipcode, temperature)
>     socket.send(message)
>     print 'send', message
>     time.sleep(1)
> 
> 
> When I am running the code without any consumer. it will block at
> 'socket.send'
> 
> But after I read the document, I think when I set HWM, the message will
> send to memory buffer, it shouldn't block. Is there any wrong? How can I
> make the 'socket.send' won't block?
> 
> my zmq version was 2.1.11
> 
> I will appreciate any help from you!

This is one of the non-obvious aspects of zmq. Queues only exist when there 
are known connections (whether potential or established). For sockets that 
connect, the connections are known as you specify them. For sockets that bind, 
the connections are known only when they are received. Therefore, a bind 
socket that has no peers (no known connections) will block when you try to 
send.

It's a little confusing because a connect socket that no peers will not block, 
meaning that the choice to bind or connect produces different behaviors. But it 
makes sense once you understand how the queues work.

Justin
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.zeromq.org/pipermail/zeromq-dev/attachments/20130319/b867ad81/attachment.htm>


More information about the zeromq-dev mailing list