Django定时任务框架django-apscheduler的使用

1.安装库

复制代码
pip install django-apscheduler

2.添加 install_app

复制代码
django_apscheduler

3.在app下添加一个task.py文件,用来实现具体的定时任务

复制代码
task.py

def my_scheduled_job():
    print("这个任务每3秒执行一次", time.time())

4.在app下创建一个management文件夹,里面包含一个空的__init__.py和一个文件夹commands,commands里面包含一个空的__init__.py和一个start_tasks.py,其中start_tasks.py是主要的启动脚本,结构如下:

复制代码
from datetime import datetime
from apscheduler.executors.pool import ThreadPoolExecutor
from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.triggers.cron import CronTrigger
from apscheduler.triggers.date import DateTrigger
from apscheduler.triggers.interval import IntervalTrigger
from django.core.management.base import BaseCommand
from django_apscheduler.jobstores import DjangoJobStore

from ...tasks import my_scheduled_job, my_scheduled_job1


#
# Django manage.py命令:存储定时任务信息
#
class Command(BaseCommand):
    help = '启动定时任务.'

    def handle(self, *args, **options):
        # 调度器
        scheduler = BlockingScheduler()  # 研发阶段使用
        # scheduler = BackgroundScheduler() # 生产阶段使用

        # 任务存储
        scheduler.add_jobstore(DjangoJobStore(), 'default')

        # 配置线程池执行器,限制最大并发数为1,防止并发
        executor = ThreadPoolExecutor(max_workers=1)
        scheduler.executor = executor

        # 注册定义任务
        id_print_task = 'print_task__job'
        print('开始-增加任务({})'.format(id_print_task))
        scheduler.add_job(
            my_scheduled_job,
            id=id_print_task,
            name=id_print_task,
            max_instances=1,
            replace_existing=True,
            trigger=IntervalTrigger(seconds=15, start_date=datetime.now(), ),  # 从当前时间开始,每15秒钟调度一次
        )

        # 指定某个时间运行
        run_date = datetime(2024, 7, 18, 18, 33)
        scheduler.add_job(
            my_scheduled_job1,
            id='id_print_task1',
            name='id_print_task1',
            trigger=DateTrigger(run_date=run_date),  # 使用 DateTrigger 并设置 run_date
            replace_existing=True  # 如果已存在同名任务,则替换它
        )

        # 指定每天某个时间运行
        scheduler.add_job(
            my_scheduled_job1,
            id='daily_task_at_18_36',
            name='Daily Task at 18:36',
            trigger=CronTrigger(hour=18, minute=38),  # 使用 CronTrigger 并设置小时和分钟
            replace_existing=True  # 如果已存在同名任务,则替换它
        )
        print('完成-增加任务({})'.format(id_print_task))

        # 启动定时任务
        try:
            scheduler.start()
        except KeyboardInterrupt:
            scheduler.shutdown()

5.修改settings.py配置,将时区改为中国,最主要是把USE两项注释掉,否则后面的定时任务的时间会晚八小时!!!!

复制代码
settings.py

LANGUAGE_CODE = 'zh-hans'  # 中文语言代码

TIME_ZONE = 'Asia/Shanghai'  # 中国上海时区

# USE_I18N = True
#
# USE_TZ = True

6.添加完成后,做数据库迁移,会生成 表django_apscheduler_djangojob 和 表django_apscheduler_djangojobexecution

复制代码
python manage.py migrate

7.启动项目,然后启动定时任务:

复制代码
 python manage.py start_tasks

启动后,任务开始执行,数据库上述两张表会有数据进去,定时任务完成,其他的见后面拓展。

拓展:

django-apscheduler框架还提供了很多操作定时任务的函数。比如:

  • 删除任务
    scheduler.remove_job(job_name)
  • 暂停任务
    scheduler.pause_job(job_name)
  • 开启任务
    scheduler.resume_job(job_name)
  • 获取所有任务
    scheduler.get_jobs()
  • 修改任务
    scheduler.modify_job(job_name)

注:修改任务只能修改参数,如果要修改执行时间的话,有3种方法

第一就把任务删了重新创建,

第二直接操作数据库,

第三用到下面重设任务。

  • 重设任务
    scheduler.reschedule_job(job_name)

scheduler.reschedule_job(job_id="job1", trigger='interval', minutes=1)

相关推荐
烈风逍遥19 分钟前
第七篇:提示词模板管理与 Agent 提示词编排
前端·人工智能·后端
站大爷IP30 分钟前
Python的Django ORM把我坑惨了,原来select_related和prefetch_related的区别这么大
后端
陈年老古董35 分钟前
MediaPipe 姿态检测与脸部关键点检测
笔记·python·opencv·学习·dlib
用户EasyAdminBlazor37 分钟前
AdminTable 源码解析:EasyAdminBlazor 如何实现通用 CRUD?
后端
伞伞悦读41 分钟前
【第37期】Python JSON 与配置详解:序列化、反序列化、嵌套结构和配置文件
开发语言·python·json
Ticnix43 分钟前
42 天 71 次提交之后,我重新看了一遍自己的架构决策
python·agent·全栈
知守观1 小时前
Spring AOP + 自定义注解实现三角色权限控制:从设计到落地的完整方案
后端
Mikko71 小时前
jackson-databind 升到 2.21.6 就安全了吗?jackson-core 是另一个坐标,它那条 high 全局库至今没收
java·后端·安全·json
Ticnix1 小时前
我调了三个月 overlap=50,它其实一次都没生效
后端·python·agent
斯维赤1 小时前
LangChain4j 入门教学(Java 后端狂喜版
java·后端