2012-12-16 10 views
12

Mi piacerebbe abbonarsi a più filtri con ZeroMQ in Python, utilizzando un socket.ZeroMQ e più filtri di sottoscrizione in Python

sock.setsockopt(zmq.SUBSCRIBE, 'first.filter') 
sock.setsockopt(zmq.SUBSCRIBE, 'second.filter') 

Ma questo non funziona. Solo il primo è preso in considerazione.

Tuttavia ho letto questo su zeromq site: "Più filtri possono essere collegati a un singolo socket ZMQ_SUB, nel qual caso verrà accettato un messaggio se corrisponde almeno a un filtro."

sto usando zmq 2.2.0.1

quindi mi chiedo come fare. . . qualche idea?

risposta

21

Questo funziona:

import time 
import zmq 

ctx = zmq.Context() 
pub = ctx.socket(zmq.PUB) 
sub = ctx.socket(zmq.SUB) 

url = "tcp://127.0.0.1:5555" 
pub.bind(url) 
sub.connect(url) 

# subscribe to 'a' and 'b' 
sub.setsockopt(zmq.SUBSCRIBE, b'a') 
sub.setsockopt(zmq.SUBSCRIBE, b'b') 

time.sleep(1) 

for word in [ 'alpha', 'beta', 'gamma', 'apple', 'carrot', 'bagel']: 
    pub.send(word) 

time.sleep(1) 

for i in range(4): 
    print sub.recv(zmq.NOBLOCK) 

dà uscita:

alpha 
beta 
apple 
bagel 

Così entrambe le sottoscrizioni funzionano. Qual è il tuo codice esatto? Perché forse è un altro problema.

+0

Ciao, grazie per la tua risposta. Effettivamente questo funziona, nel mio caso sto usando un dispositivo di inoltro tra editore e sottoscrittore. Disabilitarlo rende le cose funzionanti ... ancora indagando sul motivo per cui il dispositivo forwarder impedisce di avere più filtri ... – Marc

+0

Ok, rispondo a me stesso che il mio codice è un po 'complicato e ho incasinato da qualche parte. Funziona perfettamente ora, grazie! – Marc