La risposta accettata è obsoleta poiché redis-py consiglia di utilizzare il blocco non bloccante get_message()
. Ma fornisce anche un modo per usare facilmente i thread.
https://pypi.python.org/pypi/redis
Ci sono tre diverse strategie per la lettura dei messaggi.
Dietro le quinte, get_message() utilizza il modulo 'select' del sistema per eseguire il polling rapido del socket della connessione. Se sono disponibili dati da leggere, get_message() lo leggerà, formatterà il messaggio e lo restituirà o lo passerà a un gestore di messaggi. Se non ci sono dati da leggere, get_message() restituirà immediatamente None. Ciò rende banale l'integrazione in un loop di eventi esistente all'interno dell'applicazione.
while True:
message = p.get_message()
if message:
# do something with the message
time.sleep(0.001) # be nice to the system :)
Versioni precedenti di redis-py leggono solo i messaggi con pubsub.listen(). listen() è un generatore che blocca fino a quando un messaggio è disponibile. Se la tua applicazione non ha bisogno di fare nient'altro che ricevere e agire sui messaggi ricevuti da redis, listen() è un modo semplice per iniziare a correre.
for message in p.listen():
# do something with the message
La terza opzione esegue un ciclo di eventi in un thread separato. pubsub.run_in_thread() crea un nuovo thread e avvia il loop degli eventi. L'oggetto thread viene restituito al chiamante di run_in_thread(). Il chiamante può utilizzare il metodo thread.stop() per arrestare il ciclo degli eventi e il thread. Dietro le quinte, questo è semplicemente un wrapper attorno a get_message() che gira in un thread separato, essenzialmente creando per te un piccolo ciclo di eventi non bloccante. run_in_thread() accetta un argomento opzionale sleep_time. Se specificato, il ciclo degli eventi chiamerà time.sleep() con il valore in ogni iterazione del ciclo.
Nota: poiché stiamo eseguendo in un thread separato, non c'è modo di gestire i messaggi che non vengono gestiti automaticamente con i gestori di messaggi registrati. Pertanto, redis-py ti impedisce di chiamare run_in_thread() se sei abbonato a pattern o canali a cui non sono collegati gestori di messaggi.
p.subscribe(**{'my-channel': my_handler})
thread = p.run_in_thread(sleep_time=0.001)
# the event loop is now running in the background processing messages
# when it's time to shut it down...
thread.stop()
Quindi, per rispondere si domanda, basta controllare get_message quando si vuole sapere se un messaggio è arrivato.
C'è un motivo per cui non vuoi essere bloccato usando l'ascolto? Le connessioni di Redis sono piuttosto economiche ed è in genere tipico generare molti di loro. –
PubSub asincrono in Python utilizzando Redis, ZMQ, Tornado - https://github.com/abhinavsingh/async_pubsub –
usa il metodo .get_message() dell'oggetto pubsub invece di .listen() (c'è un esempio sotto). [Questo metodo potrebbe non essere stato supportato nel driver Redis Python quando è stata pubblicata questa domanda]. –