django-apscheduler插件来实现Django中的定时任务

1、前言
在开发当中我们或多或少都会有某个需求需要定时去执行。
在Django框架里我比较喜欢用django-apscheduler插件来实现Django中的定时任务。
2、django-apscheduler 介绍
它支持三种任务调度任务:
1.固定时间间隔
2.固定时间点
3.crontab命令
并且还支持异步执行、后台执行调度任务。
3、安装
pip install django-apscheduler
4、使用
4.1、修改配置文件settings.py
INSTALLED_APPS = [
  "django_apscheduler"
]
4.2、迁移数据库
python manage.py migrate

# django-apscheduler会创建以下两张表来存储定时任务的信息
# django_apscheduler_djangojob
# django_apscheduler_djangojobexecution
5、示例
5.1、三种调度参数
date:希望在某个特定时间仅运行一次作业时使用
interval:要以固定的时间间隔运行作业时使用
cron:以crontab的方式运行定时任务
5.2、实例化对象
from apscheduler.schedulers.background import BackgroundScheduler
from django_apscheduler.jobstores import DjangoJobStore, register_events, register_job

scheduler = BackgroundScheduler(timezone='Asia/Shanghai')
scheduler.add_jobstore(DjangoJobStore(), 'default')
5.3、使用装饰器@register_job
# 任务在2022-04-14 18:50:00 仅执行一次
@register_job(scheduler, "date", id="timed_task1", run_date="2022-04-14 18:50:00")
def timed_task1(args):
  	"""
  	编写你的定时逻辑
  	"""
    print(args)
    
# 任务没隔30分钟执行一次,还可以设置days、hours、seconds参数也可以设置日期范围,start_date-end_date
@register_job(scheduler, "interval", id="timed_task2", minutes=30, args=[])   
def timed_task2(args):
  	print(args)

# 任务每天9点钟执行一次, args传函数需要的参数   
@register_job(scheduler, "cron", id="timed_task3", hour=9, args=[])    
def timed_task3(args):
  	print(args)
5.4、使用add_job函数
def add_timed_task(request):
  	json_body = json.loads(request.body.decode())
    try:
        start_time = json_body['start_time']
        start_time = start_time.split(':')
        hour = int(start_time[0])
        minute = int(start_time[1])
        second = int(start_time[2])
        args = json_body['data']
        kwargs = {
            "username": username,
            "password": password,
        }
        scheduler.add_job(timed_task, 'cron', hour=hour, minute=minute, second=second, args=[args, kwargs])
    except Exception as e:
        print(e)
    return JsonResponse({"code":"xx", "message":""})
  
def timed_task(args, kwargs):
  	print(".......")
    
register_events(scheduler)
scheduler.start()
    
"""
使用add_job函数可以前端传json参数来生成定时任务
使用那种模式添加定时任务,取决于你自己的需求和场景!!!
"""
5.5、 启动定时任务
# apscheduler定时任务会跟随django项目一起运行因此直接启动django即可

python manage.py runserver
6、拓展
6.1、调度器提供的种类
1. BlockingScheduler : 调度器在当前进程的主线程中运行,也就是会阻塞当前线程。
2. BackgroundScheduler : 调度器在后台线程中运行,不会阻塞当前线程。(Django框架使用)
3. AsyncIOScheduler : 结合 asyncio 模块(一个异步框架)一起使用。
4. GeventScheduler : 程序中使用 gevent(高性能的Python并发框架)作为IO模型,和 - GeventExecutor 配合使用。
5. TornadoScheduler : 程序中使用 Tornado(一个web框架)的IO模型,用 ioloop.add_timeout 完成定时唤醒。
6. TwistedScheduler : 配合 TwistedExecutor,用 reactor.callLater 完成定时唤醒。scrapy爬虫框架
7. QtScheduler : 你的应用是一个 Qt 应用,需使用QTimer完成定时唤醒
posted @ 2022-04-24 11:53  Lei、Sunny  阅读(3223)  评论(0编辑  收藏  举报