2013-12-18 10 views
6

Es gibt wahrscheinlich etwas sehr kleines, dass ich vermisse, aber ich bin nicht in der Lage, ein einfaches Pub-Sub-Beispiel in Python mit dem offiziellen Pyzmq-Paket (https://github.com/zeromq/pyzmq) zu arbeiten.ZeroMQ PubSub funktioniert nicht mit Pyzmq

Ich benutze die neueste ZeroMQ Stable Version 4.0.3 und bin in der Lage, ein einfaches Beispiel zu bekommen, das recht einfach in c funktioniert. Ich habe sowohl einen Mac als auch einen Ubuntu-Rechner ausprobiert. Ich freue mich auf jede Eingabe auf diese;)

Hier ist mein Code:

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

Antwort

11

Unter der Annahme, dass Sie starten Erst Abonnent und dann Publisher versucht der Abonnent ewig eine Verbindung zum Publisher herzustellen. Wenn Publisher angezeigt wird, dauert der Verbindungsvorgang auf der Abonnentenseite einige Zeit und Ihr Publisher kümmert sich nicht wirklich darum. Während es mit Nachrichten so schnell wie möglich ausgelöst wird, versucht der Teilnehmer eine Verbindung herzustellen. Wenn die Verbindung hergestellt ist und der Abonnent bereit ist zu empfangen, ist der Herausgeber bereits mit seiner Arbeit fertig.

Lösung: geben Teilnehmer einige Zeit durch den Schlaf Verlag Code hinzufügen:

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

Und das war es. Vielen Dank! – Stephen

+2

Warum funktioniert die C-Version dann, wie @Stephen sagt? Und gibt es eine Möglichkeit, diesen Hack loszuwerden, während die Möglichkeit beibehalten wird, viele Publisher mit einem Abonnenten zu verbinden? (leider keine 'zmq.PAIR') – Pastafarianist

+0

Ziemlich hässliche Lösung :( – DataGreed