【问题标题】:How to implement redis's pubsub timeout feature?redis的pubsub超时功能如何实现?
【发布时间】:2011-12-14 01:42:29
【问题描述】:

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

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

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?

【问题讨论】:

    标签: python redis comet flask


    【解决方案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
    

    【讨论】:

      【解决方案2】:
      p = redis.pubsub(
           ignore_subscribe_messages=True
      )
      
      p.subscribe(
          DB_PREFIX + CHANEL_KEY
      )
      
      message = None
      timeout = 20
      stop_time = time.time() + timeout
      
      # little hack for setting get_message polling timeout
      # because redis-py have bug and first call this method processed
      # without timeout
      while time.time() < stop_time:
          message = p.get_message(timeout=stop_time - time.time())
          if message:
              break
      
      if message:
          data = json.loads(message["data"])
      else:
          raise HTTPRequestTimeout
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-12
        • 1970-01-01
        相关资源
        最近更新 更多