2011-10-24 5 views
12

Desidero utilizzare la funzione pubsub di Redis per implementare comet, ma pubsub non ha timeout, quindi se I ps.listen(), verrà bloccato, anche se il client chiude il browser.come implementare la funzione di timeout pubsub di redis?

Il greenlet ha una funzione di timeout durante il processo di spawn. ma non so come combinarli insieme.

pseudo del pallone

@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? 

risposta

1

perché non sei threading (e sto assumendo questo è intenzionale e, in alcuni casi saggio) è necessario utilizzare un tipo di interrupt. I segnali sono un tipo di interruzione sui sistemi Unix per consentire di tornare a una richiamata durante una chiamata che potrebbe bloccare.

Questo esempio di file aperto che non tornerà mai è in linea con quello che si desidera fare. È preso da http://docs.python.org/library/signal.html#module-signal

Ma un avvertimento. Poiché Python utilizza un Global Interpreter Lock per eseguire la gestione del segnale OS, è soggetto a problemi di stabilità. Questi problemi dovrebbero essere rari normalmente però.

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