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)

相关推荐
Lee川1 天前
从零解剖一个 AI Agent Tool是如何实现的
前端·人工智能·后端
MY_TEUCK1 天前
【2026最新Python+AI学习基础】Python 入门笔记篇
笔记·python·学习
金銀銅鐵1 天前
[Java] 如何将 Lambda 表达式对应的类保存到 class 文件中?
java·后端
赢乐1 天前
大模型学习笔记:检索增强生成(RAG)架构
人工智能·python·深度学习·机器学习·智能体·幻觉·检索增强生成(rag)
五月君_1 天前
Bun v1.3.14 发布,Rust 版即将进 Claude Code 内测,下一版可能就告别 Zig
开发语言·后端·rust
明月_清风1 天前
🍃 MongoDB 从入门到上手:一篇写给新手的科普指南
后端·mongodb
浪里行舟1 天前
你的品牌正在被AI“遗忘”?用BuildSOM找回搜索的下一个风口
人工智能·python·程序员
程序员cxuan1 天前
当 00 后开始用 token 给学校送礼
人工智能·后端·程序员
码界筑梦坊1 天前
120-基于Python的食品营养特征数据可视化分析系统
开发语言·python·信息可视化·数据分析·毕业设计·echarts·fastapi
logo_281 天前
Xpath语法规则的学习和使用
javascript·python·xpath·xpath语法