2013-12-18 1 views
6

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

ответ

11

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

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

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") 
+0

И это было. Спасибо! – Stephen

+2

Почему версия C работает тогда, как говорит @Stephen? И есть ли способ избавиться от этого взлома, сохранив при этом возможность подключения многих издателей к одному абоненту? (увы, нет 'zmq.PAIR') – Pastafarianist

+0

Очень уродливое решение :( – DataGreed