2013-12-18 16 views
6

Jest prawdopodobnie coś bardzo małego, czego mi brakuje, ale nie jestem w stanie uzyskać prostego przykładu pub-sub pracującego w Pythonie przy użyciu oficjalnego pakietu Pyzmq (https://github.com/zeromq/pyzmq).ZeroMQ PubSub nie działa w Pyzmq

Korzystam z najnowszego stabilnego wydania 4.0.3 ZeroMQ i jestem w stanie uzyskać prosty przykład działający dość prosto w c. Próbowałem na komputerze Mac i Ubuntu. Liczę na każdym wejściu na ten temat;)

Oto mój kod:

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

Odpowiedz

11

Zakładając, że uruchomienie najpierw subskrybent, a potem wydawca, subskrybent wiecznie próbuje połączyć się z wydawcą. Gdy pojawi się wydawca, procedura połączenia po stronie subskrybenta zajmuje trochę czasu, a wydawca nie dba o to. Podczas uruchamiania z wiadomościami tak szybko, jak to możliwe, subskrybent próbuje nawiązać połączenie. Gdy połączenie zostanie nawiązane, a subskrybent będzie gotowy do odbioru, wydawca zakończy już pracę.

Rozwiązanie: abonentowi dać trochę czasu na sen, dodając do kodu wydawcy:

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

I to było to. Dziękuję Ci! – Stephen

+2

Dlaczego działa wtedy wersja C, jak mówi @Stephen? Czy jest jakiś sposób na pozbycie się tego hackowania, przy jednoczesnym zachowaniu możliwości łączenia wielu wydawców z jednym subskrybentem? (Niestety, nie 'zmq.PAIR') – Pastafarianist

+0

Bardzo brzydkie rozwiązanie :( – DataGreed

Powiązane problemy