繁体   English   中英

如何推迟 Celery 任务的执行?

[英]How can I defer the execution of Celery tasks?

我有一个小脚本,可以将任务排入队列以进行处理。 此脚本进行大量数据库查询以获取应入队的项目。 我面临的问题是 celery 工作人员在脚本排队后立即开始接收任务。 这是正确的,也是 celery 应该工作的方式,但这通常会导致我的脚本和 celery 工作人员之间出现僵局。

有没有办法可以将脚本中的所有任务排入队列,但将执行延迟到脚本完成或固定时间延迟?

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

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

我认为您正在尝试避免自己脚本的竞争条件,而不是要求延迟任务运行的方法。

然后您可以创建一个任务,并在该任务中使用 .apply() 而不是 .apply_async() 或 .delay() 调用您的每个任务。 以便这些任务依次运行

要定义任务执行的延迟,请使用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,但不支持延迟倒计时。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM