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>
あなたはここにこれらについて詳しく知ることができます。おそらくgroup
ためget
とjoin
方法は、同じ結果を返す必要がありget
は、いくつかのキャッシュを実装しますがhttp://ask.github.io/celery/userguide/tasksets.html
短い答え
使用しているバックエンドによってより効率的になります。いくつかのエッジの場合に実際にjoin
を使用する必要がある場合を除き、get
を使用してください。ここで
長い答え
はGroupResult
クラスが拡張セロリのResultSet
クラスのget
メソッドのソースです。
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
メソッドのdocstringは言うためにこれを持っています。
これは、結果ストアバックエンドでは、ポーリング(たとえば、データベース)に依存しなければならない高価な操作です。バックエンドがサポートしている場合は、
join_native
を使用することを検討する必要があります。
バックエンドがサポートしているのであれば、あなたはjoin_native
の代わりjoin
を呼び出す必要があります。しかし、get
があなたのためにこの論理を包括すれば、条件付きでどちらか一方を呼び出すことに迷惑をかけるのはなぜですか?代わりにget
を使用してください。
グループで取得または参加することができますが、これは正解ではありません – bwawok