changeset 502:ac32a026c306

simplified task locking, and fixed some bugs for keyworded arguments
author Marcin Kuzminski <marcin@python-works.com>
date Thu, 23 Sep 2010 21:25:30 +0200
parents 207f5f4d3f93
children 3d6d548ad3cc
files pylons_app/lib/celerylib/__init__.py pylons_app/lib/celerylib/tasks.py
diffstat 2 files changed, 10 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- 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)      
             
 
         
--- 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