2011-10-24 9 views
12

Quiero utilizar la característica pubsub de Redis para implementar cometa, pero pubsub no tiene tiempo de espera, por lo que si yo ps.listen(), se bloqueará, incluso si el cliente cierra el navegador.cómo implementar la función de tiempo de espera pubsub de redis?

greenlet tiene la característica de tiempo de espera cuando se genera el proceso. pero no sé cómo combinarlos.

seudo del frasco

@app.route('/') 
def comet(): 
    rc = redis.Redis() 
    ps = rc.pubsub() 
    ps.subscribe('foo') 
    for item in ps.listen(): 
     if item['type'] == 'message': 
      return item['data'] 
    # ps.listen() will block, so how to make it timeout after 30 s? 

Respuesta

1

Debido a que usted no está enhebrado (y estoy suponiendo que esto es intencional y en algunos casos en cuanto a) debe utilizar un tipo de interrupción. Las señales son un tipo de interrupción en los sistemas Unix que le permiten regresar a una devolución de llamada durante una llamada que podría bloquear.

Este ejemplo de un archivo abierto que nunca volverá está en línea con lo que desea hacer. Se ha tomado desde http://docs.python.org/library/signal.html#module-signal

Pero una advertencia. Debido a que Python usa un bloqueo de intérprete global para realizar la gestión de señales del sistema operativo, está sujeto a algunos problemas de estabilidad. Sin embargo, estos problemas deberían ser raros normalmente.

import signal, os 

def handler(signum, frame): 
    print 'Signal handler called with signal', signum 
    raise IOError("Couldn't open device!") 

# Set the signal handler and a 5-second alarm 
signal.signal(signal.SIGALRM, handler) 
signal.alarm(5) 

# This open() may hang indefinitely 
fd = os.open('/dev/ttyS0', os.O_RDWR) 

signal.alarm(0)   # Disable the alarm 
Cuestiones relacionadas