2011-10-24 17 views
12

私はRedisのpubsub機能を使って彗星を実装したいが、pubsubにはタイムアウトがないので、もし私がps.listen()ならば、クライアントがブラウザを閉じてもブロックされる。redisのpubsubタイムアウト機能を実装する方法は?

グリーンリングには、プロセスの作成時にタイムアウト機能があります。私はそれらを一緒に組み合わせる方法を知らない。

フラスコの擬似

@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

あなたがスレッドしていない(と私は、これは意図的かつ賢明ないくつかのケースであると仮定しています)あなたは、割り込みの種類を使用する必要があるため。シグナルは、Unixシステムでの割り込みの一種で、通話中にブロックする可能性のあるコールバックに戻ることができます。

このようなファイルは、決して返されませんが、あなたがやりたいことに沿った例です。それはから取られたhttp://docs.python.org/library/signal.html#module-signal

しかし警告。 Pythonはグローバルインタープリタロックを使用してOSシグナル処理を実行するため、安定性の問題が発生します。これらの問題は、通常はまれです。

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 
関連する問題