ZeroMQ PubSub не работает с Pyzmq

Возможно, что-то очень маленькое, чего мне не хватает, но я не могу получить простой пример pub-sub, работающий на Python, используя официальный пакет Pyzmq ( https://github.com/zeromq/pyzmq).

Я использую последнюю стабильную версию ZeroMQ 4.0.3 и могу получить простой пример, работающий довольно легко в c. Я пробовал как на Mac, так и на Ubuntu. Я с нетерпением жду любых отзывов по этому вопросу;)

Вот мой код:

sub.py

import zmq

ctx = zmq.Context()
s = ctx.socket(zmq.SUB)
s.connect("tcp://127.0.0.1:5567")
s.setsockopt(zmq.SUBSCRIBE,'')

while True:
    print 'waiting...'
    msg = s.recv()
    print 'received:', msg

pub.py

import zmq

ctx = zmq.Context()
s = ctx.socket(zmq.PUB)
s.bind("tcp://*:5567")

for i in range(100):
    s.send("test")

1 ответ

Решение

Предполагая, что вы запускаете подписчика сначала, а затем издателя, подписчик вечно пытается соединиться с издателем. Когда появляется издатель, процедура подключения на стороне подписчика занимает некоторое время, и ваш издатель на самом деле не заботится об этом. В то время как это срабатывает с сообщениями, как только это возможно, абонент пытается установить соединение. Когда соединение установлено и подписчик готов к приему, издатель уже завершил свою работу.

Решение: дать абоненту некоторое время, добавив спящий код в код издателя:

import zmq
import time

ctx = zmq.Context()
s = ctx.socket(zmq.PUB)
s.bind("tcp://*:5567")

time.sleep(1)
for i in range(100):
    s.send("test")
Другие вопросы по тегам