class RedisSubscriber(RedisNode): def __init__(self, config, handler): RedisNode.__init__(self, config) self._handler = handler def connect(self): conf = parse_uri(self._uri) self._channel = conf.pop('channel', self._name) self._method = conf.pop('method', 'pubsub') self._client = Redis(**conf) if self._method == 'pubsub': self._pubsub = self._client.pubsub() self._pubsub.subscribe(self._channel) def start(self): self.connect() self.loop() def loop(self): while True: self._log.debug('in subscriber loop') raw_request = self.recv() self._handler(raw_request) def recv(self): """ Return a message as a string from the receiving queue. """ self._log.debug('waiting in recv()') self._lock.acquire() if self._method == 'pubsub': msg = self._pubsub.listen().next()['data'] else: msg = self._client.blpop(self._channel)[1] self._log.debug('redisclient: %s' % self._name) self._log.debug('recv -> %s' % msg) self._lock.release() return msg def close(self): if self._method == 'pubsub': self._pubsub.unsubscribe(self._channel) self._client.connection_pool.disconnect()