jak implementovat PubSub funkci časového limitu REDIS lidové?

hlasů
12

Chci používat funkci PubSub REDIS k realizaci kometu, ale PubSub nemá časový limit, takže když jsem ps.listen(), že bude blokovat, i když klient zavře prohlížeč.

greenlet má časový limit funkce, když potěr procesu. ale nevím, jak zkombinovat.

baňka je pseudo

@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?
Položena 24/10/2011 v 12:36
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
1

Vzhledem k tomu, že nejste řezání závitů (a já jsem za předpokladu, že to je úmyslné a v některých případech na sběrnici) je nutné použít typ přerušení. Signály jsou druh přerušení na unixových systémech, která vám umožní vrátit se do zpětného volání během hovoru, který by mohl blokovat.

Tento příklad souboru otevřeného, která se už nikdy nevrátí, je v souladu s tím, co chcete dělat. Trvalo to od http://docs.python.org/library/signal.html#module-signal

Ale varování. Vzhledem k tomu, Python používá Global Interpreter Lock provádět manipulaci s OS signálu je předmětem některé problémy se stabilitou. Tyto problémy by měly být vzácné normálně ačkoli.

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
Odpovězeno 06/04/2012 v 22:42
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more