diff rhodecode/lib/celerylib/__init__.py @ 547:1e757ac98988

renamed project to rhodecode
author Marcin Kuzminski <marcin@python-works.com>
date Wed, 06 Oct 2010 03:18:16 +0200
parents pylons_app/lib/celerylib/__init__.py@9bedaa073c23
children 14559eb34003
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rhodecode/lib/celerylib/__init__.py	Wed Oct 06 03:18:16 2010 +0200
@@ -0,0 +1,60 @@
+from rhodecode.lib.pidlock import DaemonLock, LockHeld
+from vcs.utils.lazy import LazyProperty
+from decorator import decorator
+import logging
+import os
+import sys
+import traceback
+from hashlib import md5
+log = logging.getLogger(__name__)
+
+class ResultWrapper(object):
+    def __init__(self, task):
+        self.task = task
+        
+    @LazyProperty
+    def result(self):
+        return self.task
+
+def run_task(task, *args, **kwargs):
+    try:
+        t = task.delay(*args, **kwargs)
+        log.info('running task %s', t.task_id)
+        return t
+    except Exception, e:
+        print e
+        if e.errno == 111:
+            log.debug('Unnable to connect. Sync execution')
+        else:
+            log.error(traceback.format_exc())
+        #pure sync version
+        return ResultWrapper(task(*args, **kwargs))
+
+
+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(func.__name__) + '-' + \
+                '-'.join(map(str, params))).hexdigest()
+        log.info('running task with lockkey %s', lockkey)
+        try:
+            l = DaemonLock(lockkey)
+            ret = func(*fargs, **fkwargs)
+            l.release()
+            return ret
+        except LockHeld:
+            log.info('LockHeld')
+            return 'Task with key %s already running' % lockkey   
+
+    return decorator(__wrapper, func)      
+            
+
+        
+        
+    
+    
+    
+