18

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

有没有一种方法可以将我的所有任务从脚本中排入队列但延迟执行直到脚本完成或直到一个固定的时间延迟?

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

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

4

3 回答 3

23

eta/countdown 选项可以延迟任务执行:

http://docs.celeryproject.org/en/master/userguide/calling.html#eta-and-countdown

于 2012-10-22T17:58:29.730 回答
2

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

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

于 2016-04-22T07:45:22.793 回答
1

要定义任务执行的延迟,请使用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))

By using timedelta it is possible to define more complicated delays for task execution. Note that delay() is another calling API but does not support countdown for delay.

于 2020-11-22T11:29:13.050 回答