2013-12-18 12 views
6

Probabilmente c'è qualcosa di molto piccolo che mi manca ma non riesco a ottenere un semplice esempio pub-sub che funzioni in Python usando il pacchetto Pyzmq ufficiale (https://github.com/zeromq/pyzmq).ZeroMQ PubSub non funziona w Pyzmq

Sto utilizzando l'ultima versione 4.0.2 stabile di ZeroMQ e sono in grado di ottenere un semplice esempio lavorando piuttosto facilmente in c. Ho provato su entrambi i computer Mac e Ubuntu. Non vedo l'ora di qualsiasi ingresso su questo;)

Ecco il mio codice:

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

risposta

11

Supponendo che si avvia prima l'abbonato e poi l'editore, l'abbonato cerca eternamente di connettersi al publisher. Quando viene visualizzato il publisher, la procedura di connessione sul lato dell'abbonato richiede un po 'di tempo e al publisher non interessa molto. Mentre si attiva con i messaggi non appena possibile, l'abbonato sta cercando di stabilire una connessione. Quando la connessione è stabilita e il sottoscrittore è pronto a ricevere, l'editore ha già finito il suo lavoro.

Soluzione: dare abbonato po 'di tempo con l'aggiunta di sonno in codice editore:

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

E che è stato. Grazie! – Stephen

+2

Perché la versione C funziona, come dice @Stephen? E c'è un modo per sbarazzarsi di questo hack, pur mantenendo la possibilità di collegare molti editori a un solo abbonato? (ahimè, no 'zmq.PAIR') – Pastafarianist

+0

Soluzione piuttosto brutta :( – DataGreed