我的应用在页面上收集了一堆电话号码。一旦用户点击提交按钮,我创建一个芹菜任务来调用每个号码并给出一个提醒消息,然后将它们重定向到一个页面,在那里他们可以看到有关该呼叫的实时更新。我正在使用Web套接字来实时更新每个呼叫的状态,并且需要同步执行任务,因为我只能从一个号码拨出。
因此,一旦第一个呼叫/任务完成,我希望下一个呼叫/任务启动。
我查看了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')
答案 0 :(得分:24)
如果查看celery DOCS on tasks,您会看到同步调用任务,则使用apply()方法而不是apply_async()方法。
所以在你的情况下你可以使用:
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()时,任务将在本地运行(在其调用的服务器/计算机中)。如果您打算在多台服务器/机器上运行任务,这可能会产生分歧。
答案 1 :(得分:4)
如果你想一个接一个地拨打每个电话,为什么不把所有的电话都包裹在一个任务中
@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')
答案 2 :(得分:0)
可以使用celery chain
。
from celery import chain
tasks = [reminder.s(number) for number in phone_numbers]
chain(*tasks).apply_async()