[zeromq-dev] HMW not working? (DEALER - REP)
Andre Caron
andre.l.caron at gmail.com
Wed Dec 24 03:23:21 CET 2014
The kernel has a pair of internal buffers for each socket. In order for the sender to block, all the following buffers have to be full*:
1) the receiver's zmq socket queue (as per your HWM setting);
2) the receivers's TCP socket buffer;
3) the sender's TCP socket buffer;
4) the sender's zmq socket buffer.
*: the sender may temporarily block even if they are not full, such as when it is sending faster than the network can deliver the messages (in other words, only 3 and 4 are strictly required).
André
> On Dec 23, 2014, at 6:32 PM, Krystian Samp <samp.krystian at gmail.com> wrote:
>
> Hello everyone,
>
> I’m using ubuntu (via docker), zeromq version 4.0.5, and pyzmq version 14.0.1-1build2.
>
> I'm having a DEALER - REP connection where both sides have hwm set to 2. The code behind REP connects to DEALER and waits 5 seconds. The code behind DEALER sends 100 messages as rapidly as possible. I'd expect that DEALER first sends 2 messages and blocks (because of hwm and because REP is not actively receiving messages), but instead all 100 messages are sent immediately. Is this a bug? or a normal behaviour? I'd like to send only N messages to each connected REP.
>
> Thanks,
> ks
>
> Here's the example demonstrating the above behaviour:
>
> import zmq
> import threading
>
> def create_server():
> ctx = zmq.Context.instance()
> socket = ctx.socket( zmq.DEALER )
> #socket.set_hwm( 2 )
> socket.setsockopt( zmq.SNDHWM, 2 )
> socket.setsockopt( zmq.RCVHWM, 2 )
>
> socket.bind( "tcp://*:5558" )
>
> server = {
> "ctx": ctx,
> "socket": socket,
> }
> return server
>
> def create_client():
> ctx = zmq.Context.instance()
> socket = ctx.socket( zmq.REP )
> #socket.set_hwm( 2 )
> socket.setsockopt( zmq.SNDHWM, 2 )
> socket.setsockopt( zmq.RCVHWM, 2 )
> socket.connect( "tcp://127.0.0.1:5558" )
> client = {
> "ctx": ctx,
> "socket": socket,
> }
> return client
>
> def server_thread():
> server = create_server()
> for i in range( 100 ):
> server[ "socket" ].send_multipart( [ "", "krychu" ] )
> print( "+ server sent, %s" % i )
>
> def client_thread():
> client = create_client()
> sleep( 5 )
>
> # ------------------------------------------------------------------------------
> s = threading.Thread( target = server_thread )
> c = threading.Thread( target = client_thread )
>
> s.start()
> c.start()
> _______________________________________________
> zeromq-dev mailing list
> zeromq-dev at lists.zeromq.org
> http://lists.zeromq.org/mailman/listinfo/zeromq-dev
More information about the zeromq-dev
mailing list