# HG changeset patch # User Marcin Kuzminski # Date 1285269930 -7200 # Node ID ac32a026c3063427e4afc5b67ce945e9f6941b14 # Parent 207f5f4d3f93694a25c68e392380f863f22393fe simplified task locking, and fixed some bugs for keyworded arguments diff -r 207f5f4d3f93 -r ac32a026c306 pylons_app/lib/celerylib/__init__.py --- a/pylons_app/lib/celerylib/__init__.py Thu Sep 23 02:55:43 2010 +0200 +++ b/pylons_app/lib/celerylib/__init__.py Thu Sep 23 21:25:30 2010 +0200 @@ -31,21 +31,14 @@ return ResultWrapper(task(*args, **kwargs)) -class LockTask(object): - """LockTask decorator""" - - 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()) +def locked_task(func): + def __wrapper(func, *fargs, **fkwargs): + params = list(fargs) + params.extend(['%s-%s' % ar for ar in fkwargs.items()]) + lockkey = 'task_%s' % \ - md5(str(self.func) + '-' + '-'.join(map(str, params))).hexdigest() + md5(str(func.__name__) + '-' + \ + '-'.join(map(str, params))).hexdigest() log.info('running task with lockkey %s', lockkey) try: l = DaemonLock(lockkey) @@ -55,7 +48,7 @@ log.info('LockHeld') return 'Task with key %s already running' % lockkey - + return decorator(__wrapper, func) diff -r 207f5f4d3f93 -r ac32a026c306 pylons_app/lib/celerylib/tasks.py --- a/pylons_app/lib/celerylib/tasks.py Thu Sep 23 02:55:43 2010 +0200 +++ b/pylons_app/lib/celerylib/tasks.py Thu Sep 23 21:25:30 2010 +0200 @@ -2,7 +2,7 @@ from celery.task.sets import subtask from celeryconfig import PYLONS_CONFIG as config from pylons.i18n.translation import _ -from pylons_app.lib.celerylib import run_task, LockTask +from pylons_app.lib.celerylib import run_task, locked_task from pylons_app.lib.helpers import person from pylons_app.lib.smtp_mailer import SmtpMailer from pylons_app.lib.utils import OrderedDict @@ -82,7 +82,7 @@ @task -@LockTask('get_commits_stats') +@locked_task def get_commits_stats(repo_name, ts_min_y, ts_max_y): author_key_cleaner = lambda k: person(k).replace('"', "") #for js data compatibilty