我的应用在一个页面上收集了一堆电话号码。一旦用户点击提交按钮,我就会创建一个 celery 任务来调用每个号码并发出提醒消息,然后将他们重定向到一个页面,在那里他们可以看到有关调用的实时更新。我正在使用网络套接字实时更新每个调用的状态,并且需要同步执行任务,因为我只能从一个号码拨出。
所以一旦第一个调用/任务完成,我希望下一个调用/任务启动。
我看了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')
最佳答案
如果您查看 celery DOCS on tasks您会看到要同步调用任务,您使用 apply() 方法而不是 apply_async() 方法。
所以在你的情况下你可以使用:
reminder.apply(args=[number])
DOCS 还指出:
如果设置了 CELERY_ALWAYS_EAGER 设置,它将被本地 apply() 调用替换。
感谢@JivanAmara,他在评论中重申,当使用 apply() 时,任务将在本地运行(在调用它的服务器/计算机中)。如果您打算跨多个服务器/机器运行任务,这可能会产生影响。
关于python - 创建 celery 任务然后同步运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26241381/