重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
在开发后台与任务相关的功能中,遇到一个需求:用户需要能够为任务配置定时策略,使任务定时执行某个操作。
成都创新互联是一家专注于网站制作、成都做网站与策划设计,安顺网站建设哪家好?成都创新互联做网站,专注于网站建设10余年,网设计领域的专业建站公司;建站业务涵盖:安顺等地区。安顺做网站价格咨询:18980820575需求分析
根据需求,我们可以拆解成如下几个步骤:
其中步骤 1 与本文无关不提;对于定时任务的实现,在上节Celery异步任务队列 有简单提到 celery 也支持定时任务。
Celery 的定时任务策略配置于代码中,在启动 celery 时写入本地shelve 文件,不利于管理。
因此在 celery 的文档中也提到一个扩展模块 django-celery-beat
,该模块将定时任务的配置写入 Django 配置的数据库中,当程序启动后可以通过 admin
后台进行管理,并且可以直接通过 ORM 对定时任务配置进行修改,无需修改代码然后重启 celery,符合我们预期。
当然还有很多其他库也能实现,因为我们已经使用 celery 执行异步任务,所以本文还是用 django-celery-beat
解决问题。
Celery 的定时任务使用的是类似 crontab
的语法,因此在用户体验上,要考虑普通用户的学习成本,可以提供一些常用的配置,例如每周的工作日每天 1 点执行任务;也要考虑后期的扩展性,可以提供输入框方便配置。
设计与实现
基本用法
定时策略(CrontabSchedule)
CrontabSchedule
支持类 crontab 语法,同样是 5 个配置域,分别为:
每个配置域使用空格隔开。
对每个配置域常用语法:
*
: 范围内的所有值M-N
: M到N之间的值M-N/X
或 */X
: 每X分钟、每X天等等A,B,...,Z
: 枚举的值举个例子: 每个工作日1点执行: 0 1 1-5 * *
创建定时策略代码如下:
from django_celery_beat.models import CrontabSchedule, PeriodicTask >>> schedule, _ = CrontabSchedule.objects.get_or_create( ... minute='30', ... hour='*', ... day_of_week='*', ... day_of_month='*', ... month_of_year='*', ... )