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])
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}