__init__.py
66 lines
| 1.6 KiB
| text/x-python
|
PythonLexer
r497 | from pylons_app.lib.pidlock import DaemonLock, LockHeld | |||
r467 | from vcs.utils.lazy import LazyProperty | |||
r497 | from decorator import decorator | |||
r467 | import logging | |||
r474 | import os | |||
import sys | ||||
import traceback | ||||
r497 | from hashlib import md5 | |||
r467 | log = logging.getLogger(__name__) | |||
class ResultWrapper(object): | ||||
def __init__(self, task): | ||||
self.task = task | ||||
@LazyProperty | ||||
def result(self): | ||||
return self.task | ||||
r487 | def run_task(task, *args, **kwargs): | |||
r467 | try: | |||
r487 | t = task.delay(*args, **kwargs) | |||
log.info('running task %s', t.task_id) | ||||
r467 | return t | |||
r487 | except Exception, e: | |||
r497 | print e | |||
r487 | if e.errno == 111: | |||
log.debug('Unnable to connect. Sync execution') | ||||
else: | ||||
log.error(traceback.format_exc()) | ||||
r467 | #pure sync version | |||
r487 | return ResultWrapper(task(*args, **kwargs)) | |||
r497 | ||||
class LockTask(object): | ||||
"""LockTask decorator""" | ||||
r487 | ||||
r497 | def __init__(self, func): | |||
self.func = func | ||||
def __call__(self, func): | ||||
return decorator(self.__wrapper, func) | ||||
def __wrapper(self, func, *fargs, **fkwargs): | ||||
params = [] | ||||
params.extend(fargs) | ||||
params.extend(fkwargs.values()) | ||||
lockkey = 'task_%s' % \ | ||||
md5(str(self.func) + '-' + '-'.join(map(str, params))).hexdigest() | ||||
log.info('running task with lockkey %s', lockkey) | ||||
try: | ||||
l = DaemonLock(lockkey) | ||||
return func(*fargs, **fkwargs) | ||||
l.release() | ||||
except LockHeld: | ||||
log.info('LockHeld') | ||||
return 'Task with key %s already running' % lockkey | ||||