Django 入门之定时任务

方案一 django-crontab

安装

pip install django-crontab

部署

在django项目的settings里添加如下:

1
2
3
4
INSTALLED_APPS = (
'django_crontab',
...
)

创建定时任务

1
2
def my_scheduled_job():
pass

配置定时任务

在django项目的settings里添加如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
CRONJOBS = [
('*/5 * * * *', 'myapp.cron.my_scheduled_job')
]

第一个参数(表示时间):
5个字段分别表示:
• 分钟:0-59
• 小时:1-23
• 日期:1-31
• 月份:1-12
• 星期:0-60表示周日)
一些特殊符号:
*: 表示任何时刻
,: 表示分割
-:表示一个段,如第二端里: 1-5,就表示15
/n : 表示每个n的单位执行一次,如第二段里,*/1, 就表示每隔1个小时执行一次命令。也可以写成1-23/1.

第二个参数(表示路径):
格式:app名称/文件名/函数名

如果想生成日志,那就再加一个字符串类型的参数:'>> path/name.log', path路径,name文件名。'>>'表示追加写入,'>'表示覆盖写入。

提示:如果你有多个定时任务,以逗号隔开,都放入CORJOBS中即可。

启动定时任务

以上都完成后,需要执行 python manage.py crontab add 将任务添加并生效

显示定时任务

python manage.py crontab show

删除定时任务

python manage.py crontab remove

优缺点:

运行和django无关,依赖的是linux的crontab定时服务,因此无法在windowns下运行。

一些问题

  1. Django低级版本可以使用吗?
    答:版本太低请安装0.6.0版本 pip install django-crontab==0.6.0

  2. 支持Windows吗?
    答:不支持

  3. 使用add命令时,遇到”bad command”/“errors in cronfile”报错。
    答:第一个参数错误,请仔细检查。

参考: https://pypi.org/project/django-crontab/

方案二 schedule

安装

pip install schedule

使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import schedule
import time

def job():
print("I'm working...")

schedule.every(10).minutes.do(job)
schedule.every().hour.do(job)
schedule.every().day.at("10:30").do(job)
schedule.every(5).to(10).minutes.do(job)
schedule.every().monday.do(job)
schedule.every().wednesday.at("13:15").do(job)
schedule.every().minute.at(":17").do(job)

while True:
schedule.run_pending()
time.sleep(1)

优缺点

优点:简单, 不依赖django,python都可以用
缺点: 在django环境需要另起线程

参考: https://pypi.org/project/schedule/

方案三 apscheduler (简单环境下,推荐使用)

安装

pip install apscheduler

使用

1
2
3
4
from apscheduler.schedulers.background import BackgroundScheduler
scheduler = BackgroundScheduler()
scheduler.add_job(test.job, 'interval', minutes=1)
scheduler.start()

优缺点

和schedule类似, 是schedule的加强版, 帮用户已经封装了线程,使用比schedule方便

参考: https://apscheduler.readthedocs.io/en/latest/index.html

方案四 celery

在小项目不建议用,杀鸡用牛刀。


Django 入门之定时任务
https://flepeng.github.io/021-Python-32-框架-Django-Django-入门之定时任务/
作者
Lepeng
发布于
2021年8月8日
许可协议