3

Python の itertools を使用して大量の製品リストを生成するプログラムがあります。基本的に、単語のさまざまな組み合わせの大きなセットです。products() 関数を実行するための複数のセットがあります。私がやりたいのは、各セットを別の Celery タスクに割り当て、最後にそれらを組み合わせることで、Celery にこれを手伝ってもらうことです。私の理解では、和音はこれを行う方法です。

だから本質的に私はこれを持っています:

callback = tabulate_results.subtask()
header = []
for combo in combos_to_run:
    header.append(run_product.subtask(args=(object_terms, combo)))
result = chord(header)(callback)
result.get()

そして、それをサポートする 2 つの簡素化された関数:

from celery import subtask, chord
@task()
def run_product(object_list, combo_set):
    results = []
    for result in product(object_list, *combo_set):
        results.append(result)
    return results

@task()
def tabulate_results(result_sets):
    master_set = []
    for result_set in result_sets:
        master_set.extend(result_set)

    return master_set

最初は、コード タスクが celeryev に表示されていましたが、ここで参照されている問題がありました: Django Celery - Missing something but I know what? 結果はありますが、Celery が MySQL を介した結果追跡に関係するエラーを返すことについて、結果を取得できません。実際、結果のバックエンドに MySQL を使用していましたが、Redis に切り替えることでそれがなくなりました。しかし、今、私は新しい問題を抱えています。Django シェルでコードを実行すると、celeryev にタスクが表示されず、これ以上何も返されません。

R IS: <GroupResult: 9f658e8d-591f-4fa9-9e79-4db0c51e8331 [9b199d1e-061f-413c-9521-4a3051dd121a, 2effbfb5-c9dc-4569-a63f-656c233a9387, 80911a60-6a22-46bb-83a1-d5a84c659794, 70acfa43-8ffe-4bc8-8ff1-1df6def035e1, dd417423-d1f6-44eb-8c4b-2ded40d7614f, fbff8adc-815d-459c-b914-b30528dbbd39]>

基本的に Celery メッセージですが、データはありません。コードも返されず、カーソルがぶら下がったままになります。control-C を出力すると、行番号は Celery で待機しているように見えるものです。celeryevが私に仕事を与えないので、私は何を考えていません。celeryev で他のタスクが表示されることを確認しました。

関数を Celery タスクとして実行せずに正常にテストしたところ、正常に戻りました。

ショートバージョン 私のDjangoアプリで集中的なPythonタスクを支援するためにCeleryコードを取得しようとしていますが、結果を返したり、celeryevに入力したりしていないようです. Redis バックエンド。セロリ バージョン 3.0.15。ジャンゴ1.4.

4

1 に答える 1

2

まず、あるタスクが別のタスクの結果を待機することは、一般的に悪い習慣と考えられています (これが、チェーン化されたサブタスクを使用する必要がある理由です)-- source

それとは別に、コードに貼り付けた構文は正しくありません。関連リンクは次のとおりです: http://docs.celeryproject.org/en/master/getting-started/next-steps.html#chords . 他の問題の中でも特に、コードがコードにタスクを渡していません。コードは、グループとして処理されるタスクのグループであり、その後コールバックが開始されます。ドキュメントから、和音の正しい構文は次のとおりです。

>>> from celery import chord
>>> from proj.tasks import add, xsum

>>> chord((add.s(i, i) for i in xrange(10)), xsum.s())().get()
90

コードは 2 つの引数を取ることに注意してください。一方では初期タスクのグループ、もう一方ではコールバック (コンマで区切られています) です。

これは始まりですが、ドキュメンテーションにより多くの時間を費やすことが、何よりも役立つようです。

于 2013-03-18T22:02:37.003 に答える