web-dev-qa-db-ja.com

セロリタスクを作成して同期的に実行する

私のアプリは、ページ上の一連の電話番号を収集します。ユーザーが送信ボタンを押したら、セロリタスクを作成して各番号に電話をかけ、リマインダーメッセージを送信して、通話に関する最新の更新情報を確認できるページにリダイレクトします。 Webソケットを使用して各コールのステータスをライブ更新しており、1つの番号からのダイヤルアウトにしかアクセスできないため、タスクを同期的に実行する必要があります。

したがって、最初の呼び出し/タスクが完了したら、次の呼び出し/タスクを開始したいと思います。

CELERY_ALWAYS_EAGER の設定を確認しましたが、最初のイテレーションを通過して停止しました。

@task
def reminder(number):
    # CODE THAT CALLS NUMBER HERE....

def make_calls(request):
    for number in phone_numbers:                     
        reminder.delay(number)      

    return redirect('live_call_updates') 
19
Austin

各呼び出しを次々に実行したい場合は、すべての呼び出しを1つのタスクにラップしないでください。

@task
def make_a_lot_of_calls(numbers):
    for num in numbers:
        # Assuming that reminder blocks till the call finishes
        reminder(number)

def make_calls(request):
    make_a_lot_of_calls.delay(phone_numers)                          
    return redirect('live_call_updates') 
3
srj

タスクのセロリDOCS を見ると、タスクを同期的に呼び出すには、apply_async()メソッドではなく、apply()メソッドを使用していることがわかります。

したがって、あなたの場合は次のように使用できます:

_ reminder.apply(args=[number])
_

DOCSは次の点にも注意しています。
If the CELERY_ALWAYS_EAGER setting is set, it will be replaced by a local apply() call instead.

コメントで@JivanAmaraに感謝します。apply()を使用すると、タスクはローカルに(呼び出されたサーバー/コンピューターで)実行されるということです。また、複数のサーバー/マシン間でタスクを実行することを意図した場合、これは影響を与える可能性があります。

23
Komu