创建芹菜任务然后同步运行

时间:2014-10-07 17:04:31

标签: python django celery django-celery

我的应用在页面上收集了一堆电话号码。一旦用户点击提交按钮,我创建一个芹菜任务来调用每个号码并给出一个提醒消息,然后将它们重定向到一个页面,在那里他们可以看到有关该呼叫的实时更新。我正在使用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') 

3 个答案:

答案 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()