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

あなたはここにこれらについて詳しく知ることができます。おそらくgroupためgetjoin方法は、同じ結果を返す必要がありgetは、いくつかのキャッシュを実装しますがhttp://ask.github.io/celery/userguide/tasksets.html

+0

グループで取得または参加することができますが、これは正解ではありません – bwawok

4

短い答え

使用しているバックエンドによってより効率的になります。いくつかのエッジの場合に実際に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を使用してください。

関連する問題