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

标签 python redis comet flask

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

Greenlet 在生成过程中有一个超时功能,但我不知道如何组合它们。

Flask的伪代码:

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

最佳答案

因为您没有使用线程(并且我假设这是有意的并且在某些情况下是明智的)您必须使用一种中断。信号是 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

关于python - 如何实现redis的pubsub超时功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7875008/

相关文章:

python - Mac中的Ipython Notebook : where is jupyter_notebook_config. py?

python - 长文档的 Huggingface 文档摘要

python - 从 python 中执行复杂的 python 脚本

javascript - 在 promise 中循环直到另一个 promise 结束

redis - 从哈希中清除 X 键

php - 在 PHP 中使用 cometd ?

ajax - 如何扩展 socket.io?

c++ - 我正在使用 cometd 服务器,我希望它与 C++ 交互

python - 如何优化这段代码以进行 nn 预测?

node.js - Node-Redis psubscribe 带有自定义消息