如何推迟Celery任务的执行?

时间:2012-10-22 06:42:18

标签: python django celery django-celery

我有一个小脚本,可以将任务排入队列进行处理。此脚本生成大量数据库查询以获取应入队的项目。我面临的问题是,芹菜工人一旦被剧本排队就开始接收任务。这是正确的,这是芹菜的工作方式,但这通常会导致我的剧本和芹菜工人之间的僵局。

有没有办法让我可以从脚本中排除我的所有任务,但延迟执行直到脚本完成或直到固定的时间延迟?

我在芹菜或django-celery的文档中找不到这个。这可能吗?

目前作为一个快速修复我想到将要处理的所有项目添加到列表中,当我的脚本完成所有查询后,我可以简单地遍历列表并将任务排队。也许这可以解决问题但是当你有数千个项目入队时,这可能是一个坏主意。

3 个答案:

答案 0 :(得分:15)

答案 1 :(得分:1)

我认为你试图避免自己脚本的竞争条件,而不是要求一种延迟任务运行的方法。

然后你可以创建一个任务,在那个任务中,用.apply()调用你的每个任务,而不是.apply_async()或.delay()。这些任务按顺序运行

答案 2 :(得分:0)

要定义任务执行的延迟,请使用apply_async()和具有以下格式的倒计时选项:

from datetime import timedelta
#Delay for 10 seconds
T.apply_async(args=[arg1, arg2], countdown = 10)
#Delay for 10 days 
T.apply_async(args=[arg1, arg2], countdown = timedelta(days=10))

通过使用timedelta,可以为任务执行定义更复杂的延迟。 请注意,delay()是另一个调用API,但不支持延迟倒计时。