运行 celery 周期性任务 1 小时,它需要超过 1 小时,使该任务过期?

Run celery periodic task for 1 hour, it it takes more then 1 hour, expire that task?

我有一个周期性的数据清除任务,每天 运行 一次。

我希望该任务只 运行 1 小时。如果处理该任务的持续时间超过 1 小时,则使该任务过期。它会在第二天再次 运行 持续 1 小时。

我想这样做是因为如果流量很高,那么该特定的 cerely 任务会持续 运行ning 10-15 小时。

您可以根据documentation

设置任务时限

如果你打算在特定任务上设置它,你可以使用 task_time_limit or task_soft_time_limit 取决于你的使用特点

我发现最可靠的方法是首先在 settings.py 中设置全局限制,其中值是 int 秒:

 CELERY_TASK_SOFT_TIME_LIMIT = 3540
 CELERY_TASK_TIME_LIMIT = 3600

然后,您可以捕获软时间限制异常并在达到硬限制之前清理您的任务:

from celery.exceptions import SoftTimeLimitExceeded

@shared_task
def mytask():
    try:
        return do_work()
    except SoftTimeLimitExceeded:
        cleanup_in_a_hurry()

有关详细信息,请参阅 celery settings docs

然后在定义单个任务时覆盖 soft_time_limittime_limit,例如:

@shared_task(soft_time_limit=60, time_limit=70)
def mytask()
    ...

task docs 中有更多详细信息。