예제 #1
0
def select(*queues, **kw):
    timeout = kw.get('timeout', 0)
    if len(queues) < 1:
        raise TypeError('At least one queue must be specified')
    if any([type(q) != NamedQueue for q in queues]):
        raise TypeError('Only NamedQueues supported')

    c = queues[0].c
    # TODO: Can we compare two StrictRedis instances for equality?
    #       (Queues are back to having their own StrictRedis instance).
    # if any([q.c != c for q in queues[1:]]):
    #    raise ValueError('All queues must share a client')

    if not timeout:
        response = retry_call(c.blpop, [q.name for q in queues], timeout)
    else:
        try:
            response = c.blpop([q.name for q in queues], timeout)
        except redis.ConnectionError as ex:
            trace = get_stacktrace_info(ex)
            log.warning('Redis connection error (4): %s', trace)
            time.sleep(timeout)
            response = None

    if not response:
        return response

    return response[0], json.loads(response[1])
예제 #2
0
 def listen(self):
     while True:
         self._connect()
         try:
             i = self.p.listen()
             v = next(i)
             if isinstance(v, dict) and v.get('type', '') != 'subscribe':
                 yield (v)
         except redis.ConnectionError as ex:
             trace = get_stacktrace_info(ex)
             log.warning('Redis connection error (1): %s', trace)
             self._connected = False
예제 #3
0
 def unpush(self, num=1):
     if num < 0:
         return []
     try:
         return [
             json.loads(s[21:])
             for s in retry_call(self.t, args=[self.name, num])
         ]
     except redis.ConnectionError as ex:
         trace = get_stacktrace_info(ex)
         log.warning('Redis connection error (6): %s', trace)
         return []
예제 #4
0
 def pop(self, num=1):
     num -= 1
     if num < 0:
         return []
     try:
         return [
             decode(s[21:])
             for s in retry_call(self.r, args=[self.name, num])
         ]
     except redis.ConnectionError as ex:
         trace = get_stacktrace_info(ex)
         log.warning('Redis connection error (5): %s', trace)
         return []
예제 #5
0
    def pop(self, name, blocking=True, timeout=0):
        if blocking:
            if not timeout:
                response = retry_call(self.c.blpop, name, timeout)
            else:
                try:
                    response = self.c.blpop(name, timeout)
                except redis.ConnectionError as ex:
                    trace = get_stacktrace_info(ex)
                    log.warning('Redis connection error (2): %s', trace)
                    time.sleep(timeout)
                    response = None
        else:
            response = retry_call(self.c.lpop, name)

        if not response:
            return response

        if blocking:
            return json.loads(response[1])
        else:
            return json.loads(response)
예제 #6
0
def decode(data):
    try:
        return json.loads(data)
    except:  # pylint: disable=W0702
        log.warning("Invalid data on queue: %s", str(data))
        return None