瀏覽代碼

In eventlet blocking calls must not be called in the mainthread, so added Pool.blocking(fun, *a, **kw) which spawns+waits on eventlet, or just simply calls the function for multiprocessing/threading

Ask Solem 14 年之前
父節點
當前提交
d67a31295a
共有 3 個文件被更改,包括 10 次插入1 次删除
  1. 3 0
      celery/concurrency/base.py
  2. 4 1
      celery/concurrency/evg.py
  3. 3 0
      celery/concurrency/evlet.py

+ 3 - 0
celery/concurrency/base.py

@@ -103,6 +103,9 @@ class BasePool(object):
                 traceback.format_exc(), ),
                 exc_info=sys.exc_info())
 
+    def blocking(self, fun, *args, **kwargs):
+        return fun(*args, **kwargs)
+
     def _get_info(self):
         return {}
 

+ 4 - 1
celery/concurrency/evg.py

@@ -1,4 +1,4 @@
-from gevent.greenlet import Greenlet
+from gevent import Greenlet
 from gevent.pool import Pool
 
 from celery.concurrency.base import apply_target, BasePool
@@ -18,6 +18,9 @@ class TaskPool(BasePool):
         return self._pool.spawn(apply_target, target, args, kwargs,
                                 callback, accept_callback)
 
+    def blocking(self, fun, *args, **kwargs):
+        Greenlet.spawn(fun, *args, **kwargs).get()
+
     @classmethod
     def on_import(cls):
         from gevent import monkey

+ 3 - 0
celery/concurrency/evlet.py

@@ -19,6 +19,9 @@ class TaskPool(BasePool):
         self._pool.spawn(apply_target, target, args, kwargs,
                          callback, accept_callback)
 
+    def blocking(self, fun, *args, **kwargs):
+        return spawn(fun, *args, **kwargs).wait()
+
     @classmethod
     def on_import(cls):
         import eventlet