2

我正在尝试设置一个应在一段时间后过期的定期任务。我正在使用 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

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

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

谁能阐明我做错了什么?谢谢!

4

2 回答 2

1

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

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

我正在使用芹菜 3.1.11

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

于 2014-09-29T18:35:19.997 回答
0

您可以尝试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()
于 2013-07-15T16:28:44.667 回答