как реализовать функцию тайм-аута pubsub в Redis? - PullRequest
12 голосов
/ 24 октября 2011

Я хочу использовать функцию pubisub в Redis для реализации кометы, но pubsub не имеет тайм-аута, поэтому, если я ps.listen(), он заблокируется, даже если клиент закроет браузер.

Гринлет имеет функцию тайм-аута в процессе появления. но я не знаю, как их объединить.

псевдо фляга

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

1 Ответ

1 голос
/ 07 апреля 2012

Поскольку вы не используете потоки (и я предполагаю, что это сделано намеренно, а в некоторых случаях целесообразно), вы должны использовать тип прерывания.Сигналы - это тип прерывания в системах Unix, позволяющий вам вернуться к обратному вызову во время вызова, который может заблокировать.

Этот пример открытия файла, который никогда не вернется, соответствует тому, что вы хотите сделать.Это взято из http://docs.python.org/library/signal.html#module-signal

Но предупреждение.Поскольку Python использует глобальную блокировку интерпретатора для обработки сигналов ОС, он подвержен некоторым проблемам со стабильностью.Эти проблемы обычно должны быть редкими.

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
...