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)
因为你不是线程(我假设这是故意的,并且在某些情况下是明智的),所以你必须使用某种类型的中断。信号是 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)
| 归档时间: |
|
| 查看次数: |
2155 次 |
| 最近记录: |