3

私がこのような非常に単純なタスクを持っているとしましょう:

@celery.task(ignore_result=True)
def print_page(page):
    with open('path/to/page','w') as f:
        f.write(page)

(上記のコードの潜在的な競合状態は無視してください...これは単純化された例です)

私の質問は、次の2つのコードサンプルが同じ結果を生成するかどうか、または一方が他方よりも優れているかどうかです。

選択肢A:

@celery.task(ignore_result=True)
def print_pages(page_generator):
    for page in page_generator:
        print_page.s(page).apply_async()

選択肢B:

@celery.task(ignore_result=True)
def print_pages(page_generator):
    g = group(print_page.s(page) for page in page_generator)
    g.apply_async()

そして、一般的に、私は上記が私がしていることをする正しい方法であるかどうか興味があります。基本的に、いくつかのデータを解析し、ドキュメントのすべてのページを出力するジェネレーターを返す別のタスクがあります。ページごとに分けて出力したい。

したがって、私のチェーンは次のようになります(これも簡略化されています)。

chain = fetch.s(url) | parse.s() | print_pages.s()
chain()

どういうわけか、そのチェーン内とそこにあるグループ(実際のタスクの外)でジェネレーターを放出できれば、もっと理にかなっていると思います。しかし、それが実用的か理想的かはわかりません。助けていただければ幸いです。ありがとう!

4

2 に答える 2

2

あなたの最初の選択はより良いもののようです。ファンアウトされたprint_pagesタスクの結果(ignore_result = Trueの場合)に参加する必要はないため、グループは不要なオーバーヘッド/複雑さを追加します。選択肢Aのようにタスクを個別に呼び出すだけで、問題ありません。

さらに、Pythonジェネレーターはピクルスにならないため、Celeryタスクに非同期で渡すことはできません。

于 2013-01-30T23:36:55.530 に答える
1

どちらの解決策も正しいですが、ページに依存するタスクはありませんが、タスクがサブタスクに分割されており、これらすべてのサブタスクが順番に依存していると仮定します。この場合、Bを選択してグループ化する必要があります。

于 2013-01-30T22:00:37.307 に答える