【问题标题】:Celery PeriodicTask won't expireCelery PeriodicTask 不会过期
【发布时间】:2013-07-07 16:27:21
【问题描述】:

我正在尝试设置一个应在一段时间后到期的定期任务。我正在使用 Django 1.5.1、celery 3.0.19 和 django-celery 3.0.17(一切都来自 pip)。 这是创建任务的摘录代码:

from django.utils import timezone
from datetime import timedelta, datetime
from djcelery.models import PeriodicTask, IntervalSchedule

interval = IntervalSchedule.objects.get(pk=1)  # Added through fixture - 3sec interval
expiration = timezone.now() + timedelta(seconds=10)
task = PeriodicTask(name='fill_%d' % profile.id,
                    task='fill_album',
                    args=[instance.id],
                    interval=interval,
                    expires=expiration) task.save()

我正在使用 ./manage.py celeryd -B 运行 celery

任务创建得很好,beat 每 3 秒运行一次,但 10 秒后它不会过期。起初我认为这是 django 和 celery 之间的时区问题,所以我让它运行了 3 个小时(我与 UTC 的差异)但它仍然不会过期。

在我的测试过程中,我实际上设法让它过期一次(并且记录器不断重复它已过期,每 3 秒一次),但从那以后我就无法重现它。

谁能解释我做错了什么? 谢谢!

【问题讨论】:

    标签: django celery django-celery


    【解决方案1】:

    我遇到了同样的问题,我认为 celery beat 不符合过期要求。如果您在任务中设置断点,请查看 current_task.request 对象并查看 expires 是否有值(或仅从任务中打印 current_task.request。)

    对我来说,如果我手动运行任务,current_task.request.expires 有一个值,但如果 celery beat 调度它,它是 None。

    我使用的是 celery 3.1.11

    我提交了一个错误:https://github.com/celery/celery/issues/2283

    【讨论】:

      【解决方案2】:

      您可以尝试将last_run_at 用作:

      task = PeriodicTask(name='fill_%d' % profile.id,
                          task='fill_album',
                          args=[instance.id],
                          interval=interval,
                          expires=expiration,
                          last_run_at=expiration)
      task.save()
      

      【讨论】:

      • 我刚刚做了,还是一无所获
      • 尝试在 1 天内运行 celery,如果任务会在几个小时后结束,那么设置时区的问题。如果我是对的,您应该重复检查与时区相关的设置。
      猜你喜欢
      • 2015-08-27
      • 2015-06-06
      • 2011-02-03
      • 1970-01-01
      • 2013-03-18
      • 2018-08-06
      • 2013-04-02
      • 2017-02-05
      • 2015-05-06
      相关资源
      最近更新 更多