|
@@ -103,6 +103,12 @@ def task_name_from(task):
|
|
|
return getattr(task, 'name', task)
|
|
|
|
|
|
|
|
|
+def _upgrade(fields, sig):
|
|
|
+ """Used by custom signatures in .from_dict, to keep common fields."""
|
|
|
+ sig.update(chord_size=fields.get('chord_size'))
|
|
|
+ return sig
|
|
|
+
|
|
|
+
|
|
|
class Signature(dict):
|
|
|
"""Class that wraps the arguments and execution options
|
|
|
for a single task invocation.
|
|
@@ -162,7 +168,8 @@ class Signature(dict):
|
|
|
kwargs=kwargs or {},
|
|
|
options=dict(options or {}, **ex),
|
|
|
subtask_type=subtask_type,
|
|
|
- immutable=immutable)
|
|
|
+ immutable=immutable,
|
|
|
+ chord_size=None)
|
|
|
|
|
|
def __call__(self, *partial_args, **partial_kwargs):
|
|
|
args, kwargs, _ = self._merge(partial_args, partial_kwargs, None)
|
|
@@ -194,6 +201,7 @@ class Signature(dict):
|
|
|
s = Signature.from_dict({'task': self.task, 'args': tuple(args),
|
|
|
'kwargs': kwargs, 'options': deepcopy(opts),
|
|
|
'subtask_type': self.subtask_type,
|
|
|
+ 'chord_size': self.chord_size,
|
|
|
'immutable': self.immutable}, app=self._app)
|
|
|
s._type = self._type
|
|
|
return s
|
|
@@ -345,6 +353,7 @@ class Signature(dict):
|
|
|
kwargs = _getitem_property('kwargs')
|
|
|
options = _getitem_property('options')
|
|
|
subtask_type = _getitem_property('subtask_type')
|
|
|
+ chord_size = _getitem_property('chord_size')
|
|
|
immutable = _getitem_property('immutable')
|
|
|
|
|
|
|
|
@@ -475,7 +484,7 @@ class chain(Signature):
|
|
|
tasks = d['kwargs']['tasks'] = list(tasks)
|
|
|
# First task must be signature object to get app
|
|
|
tasks[0] = maybe_signature(tasks[0], app=app)
|
|
|
- return chain(*tasks, app=app, **d['options'])
|
|
|
+ return _upgrade(d, chain(*tasks, app=app, **d['options']))
|
|
|
|
|
|
@property
|
|
|
def app(self):
|
|
@@ -511,7 +520,9 @@ class _basemap(Signature):
|
|
|
|
|
|
@classmethod
|
|
|
def from_dict(cls, d, app=None):
|
|
|
- return cls(*cls._unpack_args(d['kwargs']), app=app, **d['options'])
|
|
|
+ return _upgrade(
|
|
|
+ d, cls(*cls._unpack_args(d['kwargs']), app=app, **d['options']),
|
|
|
+ )
|
|
|
|
|
|
|
|
|
@Signature.register_type
|
|
@@ -547,7 +558,10 @@ class chunks(Signature):
|
|
|
|
|
|
@classmethod
|
|
|
def from_dict(self, d, app=None):
|
|
|
- return chunks(*self._unpack_args(d['kwargs']), app=app, **d['options'])
|
|
|
+ return _upgrade(
|
|
|
+ d, chunks(*self._unpack_args(
|
|
|
+ d['kwargs']), app=app, **d['options']),
|
|
|
+ )
|
|
|
|
|
|
def apply_async(self, args=(), kwargs={}, **opts):
|
|
|
return self.group().apply_async(
|
|
@@ -594,7 +608,9 @@ class group(Signature):
|
|
|
|
|
|
@classmethod
|
|
|
def from_dict(self, d, app=None):
|
|
|
- return group(d['kwargs']['tasks'], app=app, **d['options'])
|
|
|
+ return _upgrade(
|
|
|
+ d, group(d['kwargs']['tasks'], app=app, **d['options']),
|
|
|
+ )
|
|
|
|
|
|
def _prepared(self, tasks, partial_args, group_id, root_id, app, dict=dict,
|
|
|
Signature=Signature, from_dict=Signature.from_dict):
|
|
@@ -756,7 +772,7 @@ class chord(Signature):
|
|
|
@classmethod
|
|
|
def from_dict(self, d, app=None):
|
|
|
args, d['kwargs'] = self._unpack_args(**d['kwargs'])
|
|
|
- return self(*args, app=app, **d)
|
|
|
+ return _upgrade(d, self(*args, app=app, **d))
|
|
|
|
|
|
@staticmethod
|
|
|
def _unpack_args(header=None, body=None, **kwargs):
|
|
@@ -820,8 +836,7 @@ class chord(Signature):
|
|
|
if propagate is None else propagate)
|
|
|
group_id = uuid()
|
|
|
root_id = body.options.get('root_id')
|
|
|
- if 'chord_size' not in body:
|
|
|
- body['chord_size'] = self.__length_hint__()
|
|
|
+ body.chord_size = self.__length_hint__()
|
|
|
options = dict(self.options, **options) if options else self.options
|
|
|
if options:
|
|
|
body.options.update(options)
|