芹菜:访问上次运行任务的时间?

Posted

技术标签:

【中文标题】芹菜:访问上次运行任务的时间?【英文标题】:Celery: access to time of last run of task? 【发布时间】:2011-10-13 20:04:15 【问题描述】:

使用celery,是否可以在任务中检查上次运行该任务的时间是什么时候?

我想实现“抓取自上次运行以来的所有内容”。我可以自己跟踪上次运行的时间戳,也可以通过 celery 访问它。

这来自一个 django 项目,如果有影响的话。

【问题讨论】:

【参考方案1】:

默认情况下,celery 不会永久存储任务结果,如果您在节拍模式下运行,则会运行一些干净的进程来获取干净的任务结果以及执行信息。 希望我建议您使用 NoSQL 存储每个最后执行日期,您可以通过在任务中覆盖方法 after_return 来做到这一点

def after_return(self, status, retval, task_id, args, kwargs, einfo):
    #exit point for context managers
    self.taskLogger.__exit__(status, retval, task_id, args, kwargs, einfo)

每次任务结束时都会调用此方法,无论结果如何,通过检查状态,您可以仅在任务以 SUCCESS 完成或实施最适合您需要的行为时存储您的日期。

【讨论】:

【参考方案2】:

如果你使用 django-celery,last_run at 保存在模型中。使用普通的 django ORM 使用您的任务名称过滤 PeriodicTask 模型。

from djcelery.models import PeriodicTask

last_run = PeriodicTask.objects.only('last_run_at').get(task='TASK_NAME_HERE').last_run_at

【讨论】:

此方法依赖于知道数据库中的任务名称。有没有办法确定数据库中的哪个PeriodicTask 触发了您当前的任务运行? django-celery 被认为是旧的集成,不再推荐github.com/celery/django-celery【参考方案3】:

在最新版本的celery(5.1.2)中,可以通过这段代码获取任务的最后运行时间。

#tasks.py
from django_celery_beat.models import PeriodicTask

@shared_task(bind=True)
def backup_everyday(self)   
    try:
        last_run = PeriodicTask.objects.get(task=self.name).last_run_at
    except:
        last_run = None

每天备份只是一个示例功能。 PeriodicTask 模型有一个名为“last_run_at”的属性,它存储了任务的先前执行时间。

【讨论】:

以上是关于芹菜:访问上次运行任务的时间?的主要内容,如果未能解决你的问题,请参考以下文章

用芹菜对特定任务设置时间限制

用supervisord运行芹菜无法发现任务

芹菜中持久的长时间运行的任务

celery - 尽管已注册,但任务未运行。芹菜控制台不反映任务的接收

结束芹菜工人的任务、时间限制、工作阶段或客户的指示

芹菜任务未处理