Я заметил, что сокет ZEROMQ PUB буферизует все исходящие данные, если он подключается, например,
import zmq
import time
context = zmq.Context()
# create a PUB socket
pub = context.socket (zmq.PUB)
pub.connect("tcp://127.0.0.1:5566")
# push some message before connected
# they should be dropped
for i in range(5):
pub.send('a message should not be dropped')
time.sleep(1)
# create a SUB socket
sub = context.socket (zmq.SUB)
sub.bind("tcp://127.0.0.1:5566")
sub.setsockopt(zmq.SUBSCRIBE, "")
time.sleep(1)
# this is the only message we should see in SUB
pub.send('hi')
while True:
print sub.recv()
Суб привязка после этих сообщений, они должны быть удалены, потому что PUB должен отбрасывать сообщения, если нетодин связан с этим.Но вместо того, чтобы отбрасывать сообщения, он буферизует все сообщения.
a message should not be dropped
a message should not be dropped
a message should not be dropped
a message should not be dropped
a message should not be dropped
hi
Как видите, эти "сообщения не должны быть отброшены" буферизуются сокетом, как только он подключается, он сбрасывает их в SUB.разъем.Если я подключусь к разъему PUB и подключусь к разъему SUB, он будет работать правильно.
import zmq
import time
context = zmq.Context()
# create a PUB socket
pub = context.socket (zmq.PUB)
pub.bind("tcp://127.0.0.1:5566")
# push some message before connected
# they should be dropped
for i in range(5):
pub.send('a message should not be dropped')
time.sleep(1)
# create a SUB socket
sub = context.socket (zmq.SUB)
sub.connect("tcp://127.0.0.1:5566")
sub.setsockopt(zmq.SUBSCRIBE, "")
time.sleep(1)
# this is the only message we should see in SUB
pub.send('hi')
while True:
print repr(sub.recv())
И вы увидите только вывод
'hi'
Это странное поведениевызвать проблему, он буферизует все данные на соединительном сокете, у меня есть два сервера, сервер A публикует данные на сервер B
Server A -- publish --> Server B
Он работает нормально, если сервер B подключается к сети.Но что, если я запустил Сервер A и не запустил Сервер B?
В результате соединительный разъем PUB на Сервере A хранит все эти данные, использование памяти становится все выше и выше.
Вот в чем проблема, это поведение или ошибка?Если это особенность, где я могу найти документ, в котором упоминается такое поведение?И как я могу остановить подключение PUB сокета буферизует все данные?
Спасибо.