Почему zmq (python) сбрасывает сообщения при пакетной отправке? - PullRequest
0 голосов
/ 31 мая 2019

Я тестирую производительность zmq, посылая 100000 сообщений.Клиент подсчитывает полученные сообщения и измеряет использованное время.На моей локальной машине клиент получал каждое сообщение, но на VPS (я пробовал несколько разных моделей) некоторые сообщения были отброшены.Не уверен, что что-то не так с VPS или что-то не так с zmq.

Отправитель:

import zmq 
import random
import cbor
import time

context = zmq.Context()  
socket = context.socket(zmq.PUB)  
socket.bind("tcp://127.0.0.1:27700")
time.sleep(2)

socket.send_multipart([b'test.latency', b'start'])
for i in range(100000):
    s = str(random.random())
    socket.send_multipart([b'test.latency', s.encode()])
socket.send_multipart([b'test.latency', b'end'])

Получатель:

import datetime
import zmq

context = zmq.Context()  
socket = context.socket(zmq.SUB)  
socket.connect("tcp://127.0.0.1:27700")  
socket.setsockopt(zmq.SUBSCRIBE, 'test.latency'.encode())

s = None
count = 0
while True:
    try:
        topic, msg = socket.recv_multipart()
        count += 1
        if msg == b'start': s = datetime.datetime.now()
        if msg == b'end': break
    except Exception: pass

print(count) # should be 100002
print((datetime.datetime.now() - s).total_seconds())

Правильный счет, напечатанный получателем, должен быть 100002(включая начало и конец).

===== update ======

Эту проблему можно решить, установив для HWM значение 0.

Добавьте socket.setsockopt(zmq.SNDHWM, 0) и socket.setsockopt(zmq.RCVHWM, 0) в отправителя и получателя соответственно.

Но странно, по документу HWM по умолчанию равен 0. ZMQ_HWM

...