복붙노트

[REDIS] 방법 레디 스의 pubsub 타임 아웃 기능을 구현하는 방법?

REDIS

방법 레디 스의 pubsub 타임 아웃 기능을 구현하는 방법?

나는 혜성을 구현하기 위해 레디 스의 pubsub 기능을 사용하려면,하지만 난의 ps.listen는 (), 그것은 차단합니다 그렇다면 pubsub는 클라이언트가 브라우저를 닫을 경우에도, 시간 제한이 없습니다.

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?

해결법

  1. ==============================

    1.당신이 스레딩하지 않는 때문에 인터럽트의 유형을 사용해야합니다 (내가 있으리라 믿고있어이 의도적 현명한 어떤 경우에). 신호는 차단 할 수있는 통화 중에 콜백로 복귀 할 수 있도록 유닉스 시스템에서 인터럽트의 유형입니다.

    당신이 스레딩하지 않는 때문에 인터럽트의 유형을 사용해야합니다 (내가 있으리라 믿고있어이 의도적 현명한 어떤 경우에). 신호는 차단 할 수있는 통화 중에 콜백로 복귀 할 수 있도록 유닉스 시스템에서 인터럽트의 유형입니다.

    반환하지 않습니다 파일 오픈이 예제는 당신이 원하는 것과 일치한다. 그것은 http://docs.python.org/library/signal.html#module-signal에서 가져온 것

    그러나 경고. 파이썬 글로벌 인터프리터 잠금을 사용하기 때문에 일부 안정성 문제로 처리 될 신호 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
    
  2. from https://stackoverflow.com/questions/7875008/how-to-implement-rediss-pubsub-timeout-feature by cc-by-sa and MIT license