|
@@ -87,6 +87,7 @@ class AsyncResult(ResultBase):
|
|
self.backend = backend or self.app.backend
|
|
self.backend = backend or self.app.backend
|
|
self.task_name = task_name
|
|
self.task_name = task_name
|
|
self.parent = parent
|
|
self.parent = parent
|
|
|
|
+ self._cache = None
|
|
|
|
|
|
def as_tuple(self):
|
|
def as_tuple(self):
|
|
parent = self.parent
|
|
parent = self.parent
|
|
@@ -153,13 +154,21 @@ class AsyncResult(ResultBase):
|
|
on_interval = self._maybe_reraise_parent_error
|
|
on_interval = self._maybe_reraise_parent_error
|
|
on_interval()
|
|
on_interval()
|
|
|
|
|
|
- return self.backend.wait_for(
|
|
|
|
- self.id, timeout=timeout,
|
|
|
|
- propagate=propagate,
|
|
|
|
- interval=interval,
|
|
|
|
- on_interval=on_interval,
|
|
|
|
- no_ack=no_ack,
|
|
|
|
- )
|
|
|
|
|
|
+ if self._cache:
|
|
|
|
+ if propagate:
|
|
|
|
+ self.maybe_reraise()
|
|
|
|
+ return self.result
|
|
|
|
+
|
|
|
|
+ try:
|
|
|
|
+ return self.backend.wait_for(
|
|
|
|
+ self.id, timeout=timeout,
|
|
|
|
+ propagate=propagate,
|
|
|
|
+ interval=interval,
|
|
|
|
+ on_interval=on_interval,
|
|
|
|
+ no_ack=no_ack,
|
|
|
|
+ )
|
|
|
|
+ finally:
|
|
|
|
+ self._get_task_meta() # update self._cache
|
|
wait = get # deprecated alias to :meth:`get`.
|
|
wait = get # deprecated alias to :meth:`get`.
|
|
|
|
|
|
def _maybe_reraise_parent_error(self):
|
|
def _maybe_reraise_parent_error(self):
|
|
@@ -298,6 +307,9 @@ class AsyncResult(ResultBase):
|
|
def __reduce_args__(self):
|
|
def __reduce_args__(self):
|
|
return self.id, self.backend, self.task_name, None, self.parent
|
|
return self.id, self.backend, self.task_name, None, self.parent
|
|
|
|
|
|
|
|
+ def __del__(self):
|
|
|
|
+ self._cache = None
|
|
|
|
+
|
|
@cached_property
|
|
@cached_property
|
|
def graph(self):
|
|
def graph(self):
|
|
return self.build_graph()
|
|
return self.build_graph()
|
|
@@ -308,22 +320,42 @@ class AsyncResult(ResultBase):
|
|
|
|
|
|
@property
|
|
@property
|
|
def children(self):
|
|
def children(self):
|
|
- children = self.backend.get_children(self.id)
|
|
|
|
|
|
+ return self._get_task_meta().get('children')
|
|
|
|
+
|
|
|
|
+ def _get_task_meta(self):
|
|
|
|
+ if self._cache is None:
|
|
|
|
+ meta = self.backend.get_task_meta(self.id)
|
|
|
|
+ if meta:
|
|
|
|
+ state = meta['status']
|
|
|
|
+ if state == states.SUCCESS or state in states.PROPAGATE_STATES:
|
|
|
|
+ self._set_cache(meta)
|
|
|
|
+ return self._set_cache(meta)
|
|
|
|
+ return meta
|
|
|
|
+ return self._cache
|
|
|
|
+
|
|
|
|
+ def _set_cache(self, d):
|
|
|
|
+ state, children = d['status'], d.get('children')
|
|
|
|
+ if state in states.EXCEPTION_STATES:
|
|
|
|
+ d['result'] = self.backend.exception_to_python(d['result'])
|
|
if children:
|
|
if children:
|
|
- return [result_from_tuple(child, self.app) for child in children]
|
|
|
|
|
|
+ d['children'] = [
|
|
|
|
+ result_from_tuple(child, self.app) for child in children
|
|
|
|
+ ]
|
|
|
|
+ self._cache = d
|
|
|
|
+ return d
|
|
|
|
|
|
@property
|
|
@property
|
|
def result(self):
|
|
def result(self):
|
|
"""When the task has been executed, this contains the return value.
|
|
"""When the task has been executed, this contains the return value.
|
|
If the task raised an exception, this will be the exception
|
|
If the task raised an exception, this will be the exception
|
|
instance."""
|
|
instance."""
|
|
- return self.backend.get_result(self.id)
|
|
|
|
|
|
+ return self._get_task_meta()['result']
|
|
info = result
|
|
info = result
|
|
|
|
|
|
@property
|
|
@property
|
|
def traceback(self):
|
|
def traceback(self):
|
|
"""Get the traceback of a failed task."""
|
|
"""Get the traceback of a failed task."""
|
|
- return self.backend.get_traceback(self.id)
|
|
|
|
|
|
+ return self._get_task_meta().get('traceback')
|
|
|
|
|
|
@property
|
|
@property
|
|
def state(self):
|
|
def state(self):
|
|
@@ -355,7 +387,7 @@ class AsyncResult(ResultBase):
|
|
then contains the tasks return value.
|
|
then contains the tasks return value.
|
|
|
|
|
|
"""
|
|
"""
|
|
- return self.backend.get_status(self.id)
|
|
|
|
|
|
+ return self._get_task_meta()['status']
|
|
status = state
|
|
status = state
|
|
|
|
|
|
@property
|
|
@property
|
|
@@ -802,6 +834,10 @@ class EagerResult(AsyncResult):
|
|
self._state = state
|
|
self._state = state
|
|
self._traceback = traceback
|
|
self._traceback = traceback
|
|
|
|
|
|
|
|
+ def _get_task_meta(self):
|
|
|
|
+ return {'task_id': self.id, 'result': self._result, 'status':
|
|
|
|
+ self._state, 'traceback': self._traceback}
|
|
|
|
+
|
|
def __reduce__(self):
|
|
def __reduce__(self):
|
|
return self.__class__, self.__reduce_args__()
|
|
return self.__class__, self.__reduce_args__()
|
|
|
|
|