2012-10-22 8 views
8

Ich verwende ZeroMQ, um eine Publish/Subscribe-Umgebung zu ermöglichen, die ich brauche. Ich benutze einen Publish Server auf Computer A mit Python (mit EventLoop), und jetzt habe ich einen Teilnehmer in C++ auf Rechner B und einen zweiten Teilnehmer in Python (mit EventLoop) auf Rechner C.ZeroMQ PUB/SUB - Warum funktionieren nicht mehrere Abonnenten?

If Maschine B abonniert Maschine A vor Maschine C, dann erhält B abonnierte Nachrichten und C nicht. Wenn ich mir die aufgebauten Verbindungen auf Maschine A anschaue, gibt es außerdem nur eine Verbindung für Maschine B, aber nicht für C. Wenn Maschine C A vor B abonniert, dann ist es umgekehrt.

Hier ist mein Verleger Code:

import zmq 
from zmq.eventloop import ioloop, zmqstream 

ioloop.install() 

context = zmq.Context(1) 
socket = context.socket(zmq.PUB) 
publisher = zmqstream.ZMQStream(socket) 
socket.bind("tcp://*:1337") 

def publish(): 
    publisher.send_multipart(("heartbeat", "OHAI")) 

ioloop.PeriodicCallback(publish, 5000).start() 
ioloop.IOLoop.instance().start() 

Hier ist mein Python Teilnehmercode:

import zmq 
from zmq.eventloop import ioloop, zmqstream 

ioloop.install() 

context = zmq.Context(1) 
socket  = context.socket(zmq.SUB) 
subscriber = zmqstream.ZMQStream(socket) 
socket.setsockopt(zmq.SUBSCRIBE, "heartbeat") 
socket.connect("tcp://pub.local:1337") 

def subscription(message): 
    print "Message Received: %s" % (message[1]) 

subscriber.on_recv(subscription) 
ioloop.IOLoop.instance().start() 

Warum ist nicht mein Verleger mehrere eingehende Teilnehmerbuchsen akzeptieren? Es ist wahrscheinlich erwähnenswert, dass mehrere Abonnenten einwandfrei funktionieren, wenn Sie sie auf Computer A ausführen, aber ich glaube nicht, dass es sich um ein Firewall-Problem handelt, da ich Teilnehmerverbindungen von B und C mit deaktivierter Firewall getestet habe.

+0

jede Chance, dass Sie Ihre Abonnentencodes (oder beide) veröffentlichen können? – g19fanatic

+0

@ g19fanatic - sicher, ich habe meine ursprüngliche Frage bearbeitet, um den Code für meinen Python-Abonnenten einzuschließen. Ich habe momentan keinen Zugriff auf den C++ - Teilnehmer, aber ich habe bestätigt, dass ich das gleiche Ergebnis erhalte, wenn der Python-Teilnehmer auf beiden Rechnern B und C läuft (was bedeutet, dass einer der Teilnehmer in C++ geschrieben ist) scheint nicht relevant zu sein, daher hätte ich die Frage wahrscheinlich nicht mit dieser Unterscheidung verkomplizieren sollen. – Bryan

+0

Sehr seltsam. Können Sie den Code mit Publisher auf B und dann auf C mit Abonnenten auf anderen Knoten testen? Sieht so aus, als gäbe es ein Netzwerkproblem. – mechmind

Antwort

5

Vielen Dank an alle für die hilfreichen Kommentare im ursprünglichen Beitrag. Dieses Verhalten ist darauf zurückzuführen, dass bei den ZeroMQ-Versionen ein Mismatch verwendet wurde ... ein Versehen meinerseits.