2015-10-18 30 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