web-dev-qa-db-ja.com

Python + Celery:ジョブの連鎖?

セロリのドキュメント は、タスクに他のタスクの結果を待たせるのは悪い考えであることを示唆しています…しかし、提案された解決策(「良い」見出しを参照)には、何かが望まれます。具体的には、サブタスクの結果を呼び出し元に戻す明確な方法はありません(また、それは一種の醜いです)。

それで、ジョブを「チェーン」して、呼び出し元が最終的なジョブの結果を取得する方法はありますか?例:addの例を使用するには:

>>> add3 = add.subtask(args=(3, ))
>>> add.delay(1, 2, callback=add3).get()
6

または、Resultのインスタンスを返しても大丈夫ですか?例えば:

@task
def add(x, y, callback=None):
    result = x + y
    if callback:
        return subtask(callback).delay(result)
    return result

これにより、チェーン内の「最終的な」ジョブの結果を簡単に取得できます。

result = add(1, 2, callback=add3).delay()
while isinstance(result, Result):
    result = result.get()
print "result:", result
32
David Wolever

あなたはセロリチェーンでそれを行うことができます。 https://celery.readthedocs.org/en/latest/userguide/canvas.html#chains を参照してください

@task()
def add(a, b):
    time.sleep(5) # simulate long time processing
    return a + b

連鎖ジョブ:

# import chain from celery import chain
# the result of the first add job will be 
# the first argument of the second add job
ret = chain(add.s(1, 2), add.s(3)).apply_async()

# another way to express a chain using pipes
ret2 = (add.s(1, 2) | add.s(3)).apply_async()

...

# check ret status to get result
if ret.status == u'SUCCESS':
    print "result:", ret.get()
32
ax003d