是否有任何區別:差獲得,並加入
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()
芹菜文檔使用這兩個例子中,我看不出有什麼差別。
是否有任何區別:差獲得,並加入
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()
芹菜文檔使用這兩個例子中,我看不出有什麼差別。
區別在於組與和絃的區別。問題是如果你想要所有任務的結果,或者如果你想要一個任務來處理結果。
組用於啓動幾個任務,然後按照它們被調用的順序加入結果。
>>> 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
簡短的回答
雖然get
和join
方式,一種是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
將調用join
或join_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
。
您可以使用獲取或加入一個組,這不是正確的答案 – bwawok