在应用开发中有很多情况需要用到任务调度,每日统计平台访问量、清除历史日志、创建月表等任务,还有些功能是需要平台使用人员自己去添加的,比如我要填加明天下午4点的会议提醒,从网上看到的celery中似乎是没有提供这样的API接口去添加任务。
djcelery models.py
在djcelery中定义的models可以看到,有PeriodicTask、CrontabSchedule、IntervalSchedule、WorkerState、TaskState,并且在文件中可以看到
signals.pre_delete.connect(PeriodicTasks.changed, sender=PeriodicTask)
signals.pre_save.connect(PeriodicTasks.changed, sender=PeriodicTask)
这也是有的博客中提到在数据库 djcelery_periodictask 表中增加任务记录,不能被执行需要重启服务才能触发的原因。
实践
在我们的业务代码中引用
from djcelery.models import PeriodicTask, IntervalSchedule, CrontabSchedule
# -*- coding:utf-8 -*-
"""
Created on 2019/11/18
@author: jj
"""
from djcelery.models import PeriodicTask, IntervalSchedule, CrontabSchedule
from util.apiview import GomAPIView
class PeriodicTaskV(GomAPIView):
def victim(self):
# PeriodicTask(name='测试',
# task='bus_archive.tasks.ActualTotalWater',
# args='[]',
# kwargs='{}',
# enabled=1,
# interval_id=1,
# ).save()
PeriodicTask.objects.filter(id=5).delete()
class IntervalScheduleV(GomAPIView):
"""
PERIOD_CHOICES = (('days', _('Days')),
('hours', _('Hours')),
('minutes', _('Minutes')),
('seconds', _('Seconds')),
('microseconds', _('Microseconds')))
"""
def victim(self):
IntervalSchedule(every=50,
period='seconds'
).save()
在不重启服务的情况下,新增的任务是可以正常执行的
执行结果