|
@@ -25,7 +25,7 @@ from kombu.utils import kwdict
|
|
|
|
|
|
from celery import current_app
|
|
|
from celery import states, signals
|
|
|
-from celery._state import _task_stack, default_app
|
|
|
+from celery._state import _task_stack
|
|
|
from celery.app import set_default_app
|
|
|
from celery.app.task import Task as BaseTask, Context
|
|
|
from celery.datastructures import ExceptionInfo
|
|
@@ -52,72 +52,6 @@ _tasks = None
|
|
|
_patched = {}
|
|
|
|
|
|
|
|
|
-def setup_worker_optimizations(app):
|
|
|
- global _tasks
|
|
|
- global trace_task_ret
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- _install_stack_protection()
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- set_default_app(app)
|
|
|
-
|
|
|
-
|
|
|
- app.finalize()
|
|
|
-
|
|
|
-
|
|
|
- _tasks = app._tasks
|
|
|
-
|
|
|
- trace_task_ret = _fast_trace_task
|
|
|
-
|
|
|
-
|
|
|
-def reset_worker_optimizations():
|
|
|
- global trace_task_ret
|
|
|
- trace_task_ret = trace_task
|
|
|
- try:
|
|
|
- delattr(BaseTask, '_stackprotected')
|
|
|
- except AttributeError:
|
|
|
- pass
|
|
|
- try:
|
|
|
- BaseTask.__call__ = _patched.pop('BaseTask.__call__')
|
|
|
- except KeyError:
|
|
|
- pass
|
|
|
-
|
|
|
-
|
|
|
-def _install_stack_protection():
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- if not getattr(BaseTask, '_stackprotected', False):
|
|
|
- _patched['BaseTask.__call__'] = orig = BaseTask.__call__
|
|
|
-
|
|
|
- def __protected_call__(self, *args, **kwargs):
|
|
|
- req, stack = self.request, self.request_stack
|
|
|
- if not req._protected and len(stack) == 2 and \
|
|
|
- not req.called_directly:
|
|
|
- req._protected = 1
|
|
|
- return self.run(*args, **kwargs)
|
|
|
- return orig(self, *args, **kwargs)
|
|
|
- BaseTask.__call__ = __protected_call__
|
|
|
- BaseTask._stackprotected = True
|
|
|
-
|
|
|
-
|
|
|
def mro_lookup(cls, attr, stop=(), monkey_patched=[]):
|
|
|
"""Returns the first node by MRO order that defines an attribute.
|
|
|
|
|
@@ -382,3 +316,77 @@ def report_internal_error(task, exc):
|
|
|
return exc_info
|
|
|
finally:
|
|
|
del(_tb)
|
|
|
+
|
|
|
+
|
|
|
+def setup_worker_optimizations(app):
|
|
|
+ global _tasks
|
|
|
+ global trace_task_ret
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ _install_stack_protection()
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ set_default_app(app)
|
|
|
+
|
|
|
+
|
|
|
+ app.finalize()
|
|
|
+
|
|
|
+
|
|
|
+ _tasks = app._tasks
|
|
|
+
|
|
|
+ trace_task_ret = _fast_trace_task
|
|
|
+ try:
|
|
|
+ sys.modules['celery.worker.job'].trace_task_ret = _fast_trace_task
|
|
|
+ except KeyError:
|
|
|
+ pass
|
|
|
+
|
|
|
+
|
|
|
+def reset_worker_optimizations():
|
|
|
+ global trace_task_ret
|
|
|
+ trace_task_ret = _trace_task_ret
|
|
|
+ try:
|
|
|
+ delattr(BaseTask, '_stackprotected')
|
|
|
+ except AttributeError:
|
|
|
+ pass
|
|
|
+ try:
|
|
|
+ BaseTask.__call__ = _patched.pop('BaseTask.__call__')
|
|
|
+ except KeyError:
|
|
|
+ pass
|
|
|
+ try:
|
|
|
+ sys.modules['celery.worker.job'].trace_task_ret = _trace_task_ret
|
|
|
+ except KeyError:
|
|
|
+ pass
|
|
|
+
|
|
|
+
|
|
|
+def _install_stack_protection():
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ if not getattr(BaseTask, '_stackprotected', False):
|
|
|
+ _patched['BaseTask.__call__'] = orig = BaseTask.__call__
|
|
|
+
|
|
|
+ def __protected_call__(self, *args, **kwargs):
|
|
|
+ req, stack = self.request, self.request_stack
|
|
|
+ if not req._protected and len(stack) == 2 and \
|
|
|
+ not req.called_directly:
|
|
|
+ req._protected = 1
|
|
|
+ return self.run(*args, **kwargs)
|
|
|
+ return orig(self, *args, **kwargs)
|
|
|
+ BaseTask.__call__ = __protected_call__
|
|
|
+ BaseTask._stackprotected = True
|