我有一个小脚本,可以将任务排入队列进行处理。此脚本生成大量数据库查询以获取应入队的项目。我面临的问题是,芹菜工人一旦被剧本排队就开始接收任务。这是正确的,这是芹菜的工作方式,但这通常会导致我的剧本和芹菜工人之间的僵局。
有没有办法让我可以从脚本中排除我的所有任务,但延迟执行直到脚本完成或直到固定的时间延迟?
我在芹菜或django-celery的文档中找不到这个。这可能吗?
目前作为一个快速修复我想到将要处理的所有项目添加到列表中,当我的脚本完成所有查询后,我可以简单地遍历列表并将任务排队。也许这可以解决问题但是当你有数千个项目入队时,这可能是一个坏主意。
答案 0 :(得分:15)
eta / countdown选项可以延迟任务执行:
http://docs.celeryproject.org/en/master/userguide/calling.html#eta-and-countdown
答案 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,但不支持延迟倒计时。