0

他のセロリ タスクを呼び出すセロリ タスクを作成した場合、下流のタスクが完了するのを待たずに親タスク/ワーカーを解放できますか?

状況: 次の API 呼び出しのデータと引数を返す API を使用しています。API の背後にあるすべてのデータをデータベースに入れたい。私の現在の方法は、バッチが動作するように API をクエリし、いくつかのダウンストリーム プロセッサを起動してから、API+処理チェーンを再帰的に再呼び出しすることです。これにより、ワーカーが子の結果を気にしない場合、すべての再帰 API 呼び出しが完了するのを待っているワーカーがロックされるのではないかと心配しています。

擬似コード:

@task
def apiPing(start=None):
    """ Returns a dict of 5 elements, starting at the *start* element, or the 
    beginning of the list if start is not specified.  Also present in the dict is 'remaining',
    indicating how many elements are left in the API's list"""
    return json.loads(api(start))

@task
def processList(data)
    """ Takes a result from API ping, starts a task to store each element and a 
    chain to recall the API and process that."""
    for element in data:
        store(element).delay()

    if data['remaining']!=0:
        chain = chain(apiPing.s(data['last']), processList.s())
        chain.delay()

ここから、上記は非常に悪いことに近いことを理解しています。API 内のすべてのデータが処理されるまで、processList() を処理するワーカーをロックしたくありません。ダウンストリーム タスクを開始して親ワーカーを解放する方法、またはワーカーをロックしないように上記をリファクタリングする方法はありますか?

テストの結果、ワーカーは実際には次のようにロックされていることがわかりました。

from celery import task
from time import sleep

@task
def parent():
    print "In parent"
    child.apply_async()
    print "Out of parent"

@task
def child():
    print "In child"
    sleep(10)
    print "Out of child"

[2013-08-05 18:37:29,264: WARNING/PoolWorker-4] In parent
[2013-08-05 18:37:31,278: WARNING/PoolWorker-2] In child
[2013-08-05 18:37:41,285: WARNING/PoolWorker-2] Out of child
[2013-08-05 18:37:41,298: WARNING/PoolWorker-4] Out of parent
4

0 に答える 0