私のアプリは、ページ上の一連の電話番号を収集します。ユーザーが送信ボタンを押したら、セロリタスクを作成して各番号に電話をかけ、リマインダーメッセージを送信して、通話に関する最新の更新情報を確認できるページにリダイレクトします。 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')
各呼び出しを次々に実行したい場合は、すべての呼び出しを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')
タスクのセロリ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()を使用すると、タスクはローカルに(呼び出されたサーバー/コンピューターで)実行されるということです。また、複数のサーバー/マシン間でタスクを実行することを意図した場合、これは影響を与える可能性があります。