Согласно документации ZeroMQ сокет паба должен отбрасывать сообщения, как только количество сообщений в очереди достигает максимальной отметки.
Это не работает в следующем примере (и да, я устанавливаю hwm
перед привязкой / подключением):
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
Я отправляю сообщения в паб в 10 раз быстрее, чем читаю их во вспомогательном сокете, hwm
установлен на 2. Я ожидал бы получать только каждое 10-е сообщение. Вместо этого я вижу следующий вывод:
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
...
поэтому я вижу все поступающие сообщения, поэтому они удерживаются в некоторой очереди, пока я их не прочитаю. То же самое справедливо и при добавлении hwm = 2 в суб-сокет до подключения.
Что я делаю не так или я неправильно понимаю hwm
?
Я использую pyzmq версия 17.1.2