mirror of https://github.com/peter4431/rq.git
Refactor the whole Redis connection stuff to be just as easy as in RDB.
parent
5c4163400e
commit
d721f0708b
@ -1,39 +1,5 @@
|
|||||||
import uuid
|
from .proxy import conn
|
||||||
from pickle import loads, dumps
|
|
||||||
from .conn import current_connection, push_connection, pop_connection
|
|
||||||
from .queue import Queue
|
from .queue import Queue
|
||||||
|
from .job import job
|
||||||
|
|
||||||
def to_queue_key(queue_name):
|
__all__ = ['conn', 'Queue', 'job']
|
||||||
return 'rq:%s' % (queue_name,)
|
|
||||||
|
|
||||||
class DelayedResult(object):
|
|
||||||
def __init__(self, key):
|
|
||||||
self.key = key
|
|
||||||
self._rv = None
|
|
||||||
|
|
||||||
@property
|
|
||||||
def return_value(self):
|
|
||||||
if self._rv is None:
|
|
||||||
rv = current_connection().get(self.key)
|
|
||||||
if rv is not None:
|
|
||||||
# cache the result
|
|
||||||
self._rv = loads(rv)
|
|
||||||
return self._rv
|
|
||||||
|
|
||||||
|
|
||||||
class job(object):
|
|
||||||
def __init__(self, queue='normal'):
|
|
||||||
self.queue = queue
|
|
||||||
|
|
||||||
def __call__(self, f):
|
|
||||||
def delay(*args, **kwargs):
|
|
||||||
queue_key = to_queue_key(self.queue)
|
|
||||||
key = '%s:result:%s' % (queue_key, str(uuid.uuid4()))
|
|
||||||
if f.__module__ == '__main__':
|
|
||||||
raise ValueError('Functions from the __main__ module cannot be processed by workers.')
|
|
||||||
s = dumps((f, key, args, kwargs))
|
|
||||||
current_connection().rpush(queue_key, s)
|
|
||||||
return DelayedResult(key)
|
|
||||||
f.delay = delay
|
|
||||||
return f
|
|
||||||
|
|
||||||
|
@ -1,18 +0,0 @@
|
|||||||
from werkzeug.local import LocalStack
|
|
||||||
|
|
||||||
class NoRedisConnectionException(Exception):
|
|
||||||
pass
|
|
||||||
|
|
||||||
_conn = LocalStack()
|
|
||||||
|
|
||||||
def push_connection(redis_conn):
|
|
||||||
_conn.push(redis_conn)
|
|
||||||
|
|
||||||
def pop_connection():
|
|
||||||
return _conn.pop()
|
|
||||||
|
|
||||||
def current_connection():
|
|
||||||
conn = _conn.top
|
|
||||||
if conn is None:
|
|
||||||
raise NoRedisConnectionException('Connect to Redis first.')
|
|
||||||
return conn
|
|
@ -0,0 +1,36 @@
|
|||||||
|
import uuid
|
||||||
|
from pickle import loads, dumps
|
||||||
|
from .proxy import conn
|
||||||
|
from .queue import Queue
|
||||||
|
|
||||||
|
|
||||||
|
class DelayedResult(object):
|
||||||
|
def __init__(self, key):
|
||||||
|
self.key = key
|
||||||
|
self._rv = None
|
||||||
|
|
||||||
|
@property
|
||||||
|
def return_value(self):
|
||||||
|
if self._rv is None:
|
||||||
|
rv = conn.get(self.key)
|
||||||
|
if rv is not None:
|
||||||
|
# cache the result
|
||||||
|
self._rv = loads(rv)
|
||||||
|
return self._rv
|
||||||
|
|
||||||
|
|
||||||
|
class job(object):
|
||||||
|
def __init__(self, queue_name='default'):
|
||||||
|
self.queue = Queue(queue_name)
|
||||||
|
|
||||||
|
def __call__(self, f):
|
||||||
|
def delay(*args, **kwargs):
|
||||||
|
rv_key = '%s:result:%s' % (self.queue.key, str(uuid.uuid4()))
|
||||||
|
if f.__module__ == '__main__':
|
||||||
|
raise ValueError('Functions from the __main__ module cannot be processed by workers.')
|
||||||
|
s = dumps((f, rv_key, args, kwargs))
|
||||||
|
conn.rpush(self.queue.key, s)
|
||||||
|
return DelayedResult(rv_key)
|
||||||
|
f.delay = delay
|
||||||
|
return f
|
||||||
|
|
@ -0,0 +1,30 @@
|
|||||||
|
import redis
|
||||||
|
|
||||||
|
class NoRedisConnectionException(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class RedisConnectionProxy(object):
|
||||||
|
def __init__(self):
|
||||||
|
self.stack = []
|
||||||
|
|
||||||
|
def _get_current_object(self):
|
||||||
|
try:
|
||||||
|
return self.stack[-1]
|
||||||
|
except IndexError:
|
||||||
|
msg = 'No Redis connection configured.'
|
||||||
|
raise NoRedisConnectionException(msg)
|
||||||
|
|
||||||
|
def pop(self):
|
||||||
|
return self.stack.pop()
|
||||||
|
|
||||||
|
def push(self, db):
|
||||||
|
self.stack.append(db)
|
||||||
|
|
||||||
|
def __getattr__(self, name):
|
||||||
|
return getattr(self._get_current_object(), name)
|
||||||
|
|
||||||
|
|
||||||
|
conn = RedisConnectionProxy()
|
||||||
|
|
||||||
|
__all__ = ['conn']
|
Loading…
Reference in New Issue