示例#1
0
文件: model.py 项目: jietang/dbrc
def _send_to_screen(screen_id, data):
    print 'broadcasting to', screen_id, '\n\tdata: ', data
    screen_channel = 'screen_channel_%s' % screen_id
    redis_session.publish((screen_channel), data)
    screen_queue = _rget('screen_message_queue_%s' % screen_channel) or []
    screen_queue.append(data)
    _rset('queue_%s' % screen_channel, screen_queue[:100])
示例#2
0
文件: lib.py 项目: jietang/dbrc
def blocking_listen(channel, timeout=None):
    #TODO: timeouts are kinda tricky
    assert timeout < 60 * 5, 'maximum 5 minute timeout'
    current_queue = non_blocking_listen(channel)
    if current_queue:
        return {"result": "ok", "data": current_queue[-1]}
    myq = Queue.Queue()
    kill_channel = '%s' % uuid.uuid4()
    def wait_thing(timeout):
        if not timeout:
            return
        else:
            time.sleep(timeout)
            myq.put('END')
    def get_signal():
        p = redis_session.pubsub()
        p.subscribe(channel)
        p.subscribe(kill_channel)
        for m in p.listen():
            if m['type'] == 'message':
                myq.put(m['data'])
                return
    Thread(target=wait_thing, args=(timeout,)).start()
    Thread(target=get_signal).start()
    to_ret = myq.get()
    if to_ret == 'END':
        redis_session.publish(kill_channel, '')
        return {"result": "resubscribe", "screen_id": "1"}
    else:
        # pop off the element from the queue if we're about to send it down
        screen_queue = _rget("queue_%s" % channel) or []
        try:
            screen_queue.remove(to_ret)
        except ValueError:
            pass
        else:
            _rset('queue_%s' % channel, screen_queue)
        
        return {"result": "ok", "data": to_ret}