django-apscheduler
在django开发中如果遇到了定时任务那么就可以考虑考虑使用django-apscheduler
在django中实现定时任务有三种方法:
首先就是大家熟知的celery框架:
他的优点就是侧重于实际操作,可以用于系统每天处理百万条数据的任务,可用于大型的项目
但是他过重,配置和使用较为复杂还需要使用到redis和其他的三方库。杀鸡焉用牛刀吗,在一些小的功能或者较小的系统中还是不推荐使用的。
django-crontab
这个包也是比较方便的只需要下载就可在django项目使用cron表达式设置定时任务,但这种方法他不支持windows,功能也比较简单
django-apscheduler
他同样的配置简单,但功能更齐全,使用灵活,并且支持windows,比较适合在项目中没有用到celery的中小型项目
首先安装模块
pip3 install django-apscheduler
然后在django项目的settings.py中进行注册
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', 'corsheaders', # apscheduler
'django_apscheduler',
]
配置完成后进行迁移文件
python manage.py migrate
执行完成后会发现数据库中已经多了两张表
一个是用来存储任务的:django_apscheduler_djangojob
另一个就是具体执行时间执行代码的数据:django_apscheduler_djangojobexecution
创建任务
装饰器实现
首先在可以建一个py文件
from apscheduler.schedulers.background import BackgroundSchedulerfrom django_apscheduler.jobstores import DjangoJobStore, register_events, register_job# 实例化调度器scheduler = BackgroundScheduler()# 调度器使用默认的DjangoJobStore()scheduler.add_jobstore(DjangoJobStore(), 'default')# 每隔一分钟执行一次@register_job(scheduler, 'interval', seconds=60)def test():
# 具体要执行的代码
for key,value in socket_dict.items():
res = getexchange()
value.send(res)# 注册定时任务并开始register_events(scheduler)
scheduler.start()
然后启动django项目这个任务也会随之被启动
scheduler:指定调度器
trgger:任务执行的三种方式
date能够实现单次任务
- 比如在2018-08-08 21:30:00执行这个任务
- @register_job(scheduler, ‘date’, run_date=’2019-07-07 22:49:00’)
interval实现间隔性任务
- 比如上面写的dome就是没60秒执行一次
- 还有hour、minutes的参数,小时和分组
- 但他并不是并发执行的,如果轮到下一个任务执行,上一个还未执行完那就会放弃这个任务
cron能实现cron类的任务
比如定一个8点半的闹钟吧
- @register_job(scheduler, ‘cron’, id=’test’, hour=8, minute=30)
- 他还有day、second、month参数
id:任务的名称,不传会自动生产,如果任务需要暂停删除,建议传一个名字,并且是唯一的
args:list类型,任务要传的参数