__init__.py
60 lines
| 1.5 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 | ||||
r502 | def locked_task(func): | |||
def __wrapper(func, *fargs, **fkwargs): | ||||
params = list(fargs) | ||||
params.extend(['%s-%s' % ar for ar in fkwargs.items()]) | ||||
r497 | lockkey = 'task_%s' % \ | |||
r502 | md5(str(func.__name__) + '-' + \ | |||
'-'.join(map(str, params))).hexdigest() | ||||
r497 | log.info('running task with lockkey %s', lockkey) | |||
try: | ||||
l = DaemonLock(lockkey) | ||||
r510 | ret = func(*fargs, **fkwargs) | |||
r497 | l.release() | |||
r510 | return ret | |||
r497 | except LockHeld: | |||
log.info('LockHeld') | ||||
return 'Task with key %s already running' % lockkey | ||||
r502 | return decorator(__wrapper, func) | |||
r497 | ||||