在django中管理定时任务(一)django-crontab

0
(0)

django作为一个成熟稳定的后端框架,拥有很多的第三方插件,关于定时任务管理比较常用的是crontab,scheduler,celery,APScheduler,每种框架都各有优缺点,这里不做详细比较,结论是个人推荐使用APScheduler。

本文主要介绍django-crontab,原因是接手应用程序初期,linux主机上配置了很多定时任务,所以采用了最简单的方式,使用django-crontab将定时任务纳入程序中统一管理,最简单直接的方式就是使用django-crontab组件。该组件的原理是修改linux上的crontab定时任务,所以不支持windows操作系统,而且修改定时任务执行频率也需要修改settings.py文件,所以并不是很方便,但是针对简单的应用,不需要经常调整定时任务的话,使用这个组件是最简单的了。

一、安装

pip install django-crontab

二、配置

安装后,在settings.py的INSTALLED_APPS注册本组件

INSTALLED_APPS = (
    'django_crontab',
    ...
)

三、定义定时任务执行方法,比如在myapp/tasks.py中写以下代码:

def my_scheduled_job():
  print('my job is executed!')

四、添加任务

在settings.py中配置CRONJOBS,可以添加多个任务,任务的格式是 cron表达式,任务方法名称,关于cron表达式本文不展开介绍。

CRONJOBS = [
    # 每5分钟执行一次
    ('*/5 * * * *', 'myapp.cron.my_scheduled_job')
]

五、管理任务

django-crontab组件中定义了几个命令用于管理定时任务

# 添加当前项目中定义的任务
python manage.py crontab add
# 显示当前系统中有效的任务
python manage.py crontab show
# 从系统中移除当前项目中定义的任务
python manage.py crontab remove

在应用程序部署后,需要执行 python manage.py crontab add 使定时任务生效,检查任务是否生效的方法可以用系统命令

# 列出定时任务
$ contab -l
# 编辑定时任务
$ contab -e

另外,这个方式不支持集群化使用,如果要在集群中使用,需要在定时任务方法里手动给定时任务加锁,比如使用redis锁的方式保证同一时间只有一个任务在执行。

另外,如果使用容器化方式部署,且基础镜像是alpine时,记得在开启crond服务, 以下是我的Dockerfile和起动脚本

FROM python:3.12.5-alpine
EXPOSE 8000
...
CMD ["sh", "./start.sh"]
crond
python manage.py crontab add
python manage.py runserver
# 如果使用gunicorn
# gunicorn -c /myproj/gunicorn.conf.py myproj.wsgi

在alpine系统里,crond必须在启动命令的第一行

关于gunicorn的使用,有专门的章节介绍

2025/9/14 于北京 上东廓

这篇文章有用吗?

点击星号为它评分!

平均评分 0 / 5. 投票数: 0

到目前为止还没有投票!成为第一位评论此文章。

很抱歉,这篇文章对您没有用!

让我们改善这篇文章!

告诉我们我们如何改善这篇文章?

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注