2015-10-18 35 views
5

是否有任何区别:差获得,并加入

r = group(some_task.s(i) for i in range(10)).apply_async() 
result = r.join() 

和:

r = group(some_task.s(i) for i in range(10))() 
result = r.get() 

芹菜文档使用这两个例子中,我看不出有什么差别。

回答

0

区别在于组与和弦的区别。问题是如果你想要所有任务的结果,或者如果你想要一个任务来处理结果。

用于启动几个任务,然后按照它们被调用的顺序加入结果。

>>> job = group([ 
...    add.subtask((2, 2)), 
...    add.subtask((4, 4)), 
...    add.subtask((8, 8)), 
...    add.subtask((16, 16)), 
...    add.subtask((32, 32)), 
... ]) 
>>> result = job.apply_async() 
>>> result.join() 
[4, 8, 16, 32, 64] 

和弦是当你想指定的所有任务都完成后执行的任务。

>>> callback = last_task.subtask() 
>>> tasks = [task.subtask(...) ... ] 
>>> result = chord(tasks)(callback) 
>>> result.get() 
<output from last_task which have access to the results from the tasks> 

您可以了解更多有关这些位置:http://ask.github.io/celery/userguide/tasksets.html

+0

您可以使用获取或加入一个组,这不是正确的答案 – bwawok

4

简短的回答

虽然getjoin方式,一种是group应该返回相同的结果,get实现了一些缓存,可能会根据您使用的后端更高效。除非您确实需要使用join来处理某些边缘情况,否则您应该使用get

龙答案

这里是芹菜的ResultSet类的get方法将GroupResult类扩展源。

def get(self, timeout=None, propagate=True, interval=0.5, 
     callback=None, no_ack=True, on_message=None): 
    """See :meth:`join` 
    This is here for API compatibility with :class:`AsyncResult`, 
    in addition it uses :meth:`join_native` if available for the 
    current result backend. 
    """ 
    if self._cache is not None: 
     return self._cache 
    return (self.join_native if self.supports_native_join else self.join)(
     timeout=timeout, propagate=propagate, 
     interval=interval, callback=callback, no_ack=no_ack, 
     on_message=on_message, 
    ) 

我们首先看到的是,文档字符串告诉我们要看看在文档join方法。就在蝙蝠身上,这表明这些方法非常相似。

看一下get方法的主体,我们可以看到它首先检查缓存的值,并在设置后返回该值。如果未找到缓存值,则根据后端是否支持本机连接,get将调用joinjoin_native方法。如果您发现return声明的格式有点混乱,这在本质上是同一件事:

if self.supports_native_join: 
    return self.join_native(timeout=timeout, 
          propagate=propagate, 
          interval=interval, 
          callback=callback, 
          no_ack=no_ack, 
          on_message=on_message) 
else: 
    return self.join(timeout=timeout, 
        propagate=propagate, 
        interval=interval, 
        callback=callback, 
        no_ack=no_ack, 
        on_message=on_message) 

join方法的文档字符串是这样说的。

这可以是结果存储后端必须 诉诸轮询(例如,数据库)是昂贵的操作。如果您的后端支持,则应考虑使用 join_native

所以,你应该调用join_native而不是join如果你的后台支持它。但为什么要打扰有条件地打电话给其中一方,如果get为你包装了这个逻辑?改用get