I have a problem in High Water Mark option in ZMQ communication:
According to the ZeroMQ documentation, a pub socket is supposed to drop messages once the number of queued messages reaches the high-water mark.
This doesn't seem to work in the following example (and yes I do set the hwm before bind/connect):
import time
import pickle
from threading import Thread
import zmq
ctx = zmq.Context()
def pub_thread():
pub = ctx.socket(zmq.PUB)
pub.set_hwm(2)
pub.bind('tcp://*:5555')
i = 0
while True:
# Send message every 100ms
time.sleep(0.1)
pub.send_string("test", zmq.SNDMORE)
pub.send_pyobj(i)
i += 1
def sub_thread():
sub = ctx.socket(zmq.SUB)
sub.subscribe("test")
sub.connect('tcp://localhost:5555')
while True:
# Receive messages only every second
time.sleep(1)
msg = sub.recv_multipart()
print("Sub: %d" % pickle.loads(msg[1]))
t_pub = Thread(target=pub_thread)
t_sub = Thread(target=sub_thread)
t_pub.start()
t_sub.start()
while True:
pass
I'm sending messages on pub 10 times faster than reading them on the sub socket, hwm is set to 2. I would expect to only receive about every 10th message. Instead, I see the following output:
Sub: 0
Sub: 1
Sub: 2
Sub: 3
Sub: 4
Sub: 5
Sub: 6
Sub: 7
Sub: 8
Sub: 9
Sub: 10
Sub: 11
Sub: 12
Sub: 13
Sub: 14
...
So I see all messages arriving, thus they are held in some queue until I read them. Same holds true when adding a hwm=2 on the sub socket as well before connect.
What am I doing wrong or am I misunderstanding hwm?
I use pyzmq version 17.1.2
Also I tried with the following code, but result was the same:
import time
import pickle
import zmq
from threading import Thread
ctx = zmq.Context()
def pub_thread():
pub = ctx.socket(zmq.PUB)
pub.setsockopt(zmq.SNDHWM, 2) # This line was changed.
pub.bind('tcp://*:5555')
i = 0
while True:
time.sleep(0.1)
pub.send_string("test", zmq.SNDMORE)
pub.send_pyobj(i)
i += 1
def sub_thread():
sub = ctx.socket(zmq.SUB)
sub.setsockopt(zmq.SUBSCRIBER, b'')
sub.setsockopt(zmq.RCVHWM, 2) # This line added.
# sub.setsockopt(zmq.CONFLATE, 1) # Last msg only (another option).
sub.connect('tcp://localhost:5555')
while True:
time.sleep(1)
msg = sub.recv_multipart()
print("Sub: %d" % pickle.loads(msg[1]))
t_pub = Thread(target=pub_thread)
t_pub.start()
sub_thread() # Start with main thread.
These posts (POST1, POST2, POST3) are relevant to this issue in the Stack Overflow.
Thanks in advance,
I have a problem in High Water Mark option in ZMQ communication:
According to the ZeroMQ documentation, a
pubsocket is supposed to drop messages once the number of queued messages reaches the high-water mark.This doesn't seem to work in the following example (and yes I do set the
hwmbefore bind/connect):I'm sending messages on pub 10 times faster than reading them on the
subsocket,hwmis set to 2. I would expect to only receive about every 10th message. Instead, I see the following output:So I see all messages arriving, thus they are held in some queue until I read them. Same holds true when adding a
hwm=2on thesubsocket as well before connect.What am I doing wrong or am I misunderstanding
hwm?I use
pyzmqversion 17.1.2Also I tried with the following code, but result was the same:
These posts (POST1, POST2, POST3) are relevant to this issue in the Stack Overflow.
Thanks in advance,