我在celery
个项目中使用django
来执行某些任务。我最近需要添加periodic_task
来更新我的某个模型中对象的字段。所以我添加了periocdic_task
如下。
import datetime
import logger.logger as logger
from celery.decorators import periodic_task
@periodic_task(run_every=datetime.timedelta(seconds=30))
def entries_about_to_expire():
""" Changes the status of entries that are about to expire.
"""
try:
import entries.models as models
startdate = datetime.datetime.today()
enddate = startdate + datetime.timedelta(days=7)
soon = models.EntryStatus.objects.get_or_create(
name='Expiring Soon')[0]
models.Entries.objects.filter(expiry_date__range=[startdate, enddate])\
.update(status=soon)
except Exception, err:
logger.exception("Error while changing job status: %s" % (err))
我接下来要做的是运行celery
,如下所示:
>>python manage.py celeryd -l info --beat
到目前为止一切运行良好。我甚至可以看到芹菜发送的任务如下(根据需要每隔30秒发生一次)。
[2013-11-15 15:01:10,690: INFO/MainProcess] Scheduler: Sending due task entries.tasks.entries_about_to_expire (entries.tasks.entries_about_to_expire)
但由于某种原因,任务没有执行。我的意思是我找不到status
个Entries
个对象的任何更改。我用shell测试了这个。
In [2]: from entries.models import Entries, EntryStatus
In [3]: soon = EntryStatus.objects.get_or_create(name='Expiring Soon')[0]
In [4]: entries = Entries.objects.filter(status=soon)
In [5]: entries
Out[5]: []
即使多次发送任务,我也会得到相同的结果。我确信entries_about_to_expire
的代码运行正常,因为如果我手动调用它就可以了。例如,如果我在shell中执行以下操作
In [6]: from entries.tasks import entries_about_to_expire
In [7]: entries_about_to_expire()
In [8]: entries = Entries.objects.filter(status=soon)
In [9]: Entries
Out[9]: [<Entries: 223>, <Entries: 512>, <Entries: 526>, <Entries: 591>]
那么为什么芹菜任务没有执行?任何线索?
注意:我也尝试了celerybeat_schedule
方法,但结果相同,即任务已发送但未执行
答案 0 :(得分:0)
当时区相关设置发生更改时,数据库计划程序不会重置,因此您必须手动执行此操作。
PeriodicTask.objects.update(last_run_at=None)
参考:http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html#time-zones