如何实现redis的pubsub超时功能?

lim*_*boy 12 python comet redis flask

我想使用Redis的pubsub功能来实现彗星,但pubsub没有超时,所以如果我ps.listen(),它会阻止,即使客户端关闭浏览器.

greenlet在生成进程时具有超时功能.但我不知道如何将它们组合在一起.

烧瓶的假

@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?
Run Code Online (Sandbox Code Playgroud)

Pet*_*ore 1

因为你不是线程(我假设这是故意的,并且在某些情况下是明智的),所以你必须使用某种类型的中断。信号是 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
Run Code Online (Sandbox Code Playgroud)