Beispiel #1
0
 def __init__(self, results, app=None, ready_barrier=None, **kwargs):
     self._app = app
     self.results = results
     self.on_ready = promise(args=(self, ))
     self._on_full = ready_barrier or barrier(results)
     if self._on_full:
         self._on_full.then(promise(self._on_ready, weak=True))
Beispiel #2
0
    def apply_async(self, args=(), kwargs=None, add_to_parent=True,
                    producer=None, link=None, link_error=None, **options):
        if link is not None:
            raise TypeError('Cannot add link to group: use a chord')
        if link_error is not None:
            raise TypeError(
                'Cannot add link to group: do that on individual tasks')
        app = self.app
        if app.conf.task_always_eager:
            return self.apply(args, kwargs, **options)
        if not self.tasks:
            return self.freeze()

        options, group_id, root_id = self._freeze_gid(options)
        tasks = self._prepared(self.tasks, [], group_id, root_id, app)
        p = barrier()
        results = list(self._apply_tasks(tasks, producer, app, p,
                                         args=args, kwargs=kwargs, **options))
        result = self.app.GroupResult(group_id, results, ready_barrier=p)
        p.finalize()

        # - Special case of group(A.s() | group(B.s(), C.s()))
        # That is, group with single item that's a chain but the
        # last task in that chain is a group.
        #
        # We cannot actually support arbitrary GroupResults in chains,
        # but this special case we can.
        if len(result) == 1 and isinstance(result[0], GroupResult):
            result = result[0]

        parent_task = app.current_worker_task
        if add_to_parent and parent_task:
            parent_task.add_trail(result)
        return result
Beispiel #3
0
    def apply_async(self,
                    args=(),
                    kwargs=None,
                    add_to_parent=True,
                    producer=None,
                    **options):
        app = self.app
        if app.conf.task_always_eager:
            return self.apply(args, kwargs, **options)
        if not self.tasks:
            return self.freeze()

        options, group_id, root_id = self._freeze_gid(options)
        tasks = self._prepared(self.tasks, args, group_id, root_id, app)
        p = barrier()
        results = list(self._apply_tasks(tasks, producer, app, p, **options))
        result = self.app.GroupResult(group_id, results, ready_barrier=p)
        p.finalize()

        # - Special case of group(A.s() | group(B.s(), C.s()))
        # That is, group with single item that is a chain but the
        # last task in that chain is a group.
        #
        # We cannot actually support arbitrary GroupResults in chains,
        # but this special case we can.
        if len(result) == 1 and isinstance(result[0], GroupResult):
            result = result[0]

        parent_task = app.current_worker_task
        if add_to_parent and parent_task:
            parent_task.add_trail(result)
        return result
Beispiel #4
0
 def __init__(self, results, app=None, ready_barrier=None, **kwargs):
     self._app = app
     self.results = results
     self.on_ready = promise(args=(self,))
     self._on_full = ready_barrier or barrier(results)
     if self._on_full:
         self._on_full.then(promise(self._on_ready, weak=True))
Beispiel #5
0
 def send(self, event, payload, sender,
          context=None, extra_subscribers=None,
          allow_keepalive=True, **kwargs):
     return barrier([
         self.dispatch_request(req) for req in self.prepare_requests(
             event, payload, sender,
             context=context or {},
             extra_subscribers=extra_subscribers,
             allow_keepalive=allow_keepalive,
             **kwargs
         )
     ])
Beispiel #6
0
 def send(self, event, payload, sender,
          context=None, extra_subscribers=None,
          allow_keepalive=True, **kwargs):
     return barrier([
         self.dispatch_request(req) for req in self.prepare_requests(
             event, payload, sender,
             context=context or {},
             extra_subscribers=extra_subscribers,
             allow_keepalive=allow_keepalive,
             **kwargs
         )
     ])
Beispiel #7
0
async def apply_async(self,
                      args=None,
                      kwargs=None,
                      add_to_parent=True,
                      producer=None,
                      link=None,
                      link_error=None,
                      **options):
    args = args if args else ()
    if link is not None:
        raise TypeError('Cannot add link to group: use a chord')
    if link_error is not None:
        raise TypeError(
            'Cannot add link to group: do that on individual tasks')
    app = self.app
    if app.conf.task_always_eager:
        return self.apply(args, kwargs, **options)
    if not self.tasks:
        return self.freeze()

    options, group_id, root_id = self._freeze_gid(options)
    tasks = self._prepared(self.tasks, [], group_id, root_id, app)
    p = barrier()
    results = [
        i async for i in self._apply_tasks(
            tasks, producer, app, p, args=args, kwargs=kwargs, **options)
    ]
    result = self.app.GroupResult(group_id, results, ready_barrier=p)
    p.finalize()

    # - Special case of group(A.s() | group(B.s(), C.s()))
    # That is, group with single item that's a chain but the
    # last task in that chain is a group.
    #
    # We cannot actually support arbitrary GroupResults in chains,
    # but this special case we can.
    if len(result) == 1 and isinstance(result[0], GroupResult):
        result = result[0]

    parent_task = app.current_worker_task
    if add_to_parent and parent_task:
        parent_task.add_trail(result)
    return result
Beispiel #8
0
 def send(self, event, payload, sender, **kwargs):
     return barrier([
         self.dispatch_request(req) for req in self.prepare_requests(
             event, payload, sender, **kwargs
         )
     ])
Beispiel #9
0
 def send(self, event, payload, sender, **kwargs):
     return barrier([
         self.dispatch_request(req)
         for req in self.prepare_requests(event, payload, sender, **kwargs)
     ])