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)

相关推荐
用户1512905452201 分钟前
Langfuse-开源AI观测分析平台,结合dify工作流
后端
南囝coding6 分钟前
Claude Code 从入门到精通:最全配置指南和工具推荐
前端·后端
大翻哥哥29 分钟前
Python 2025:AI工程化与智能代理开发实战
开发语言·人工智能·python
站大爷IP39 分钟前
Python文件处理:从基础操作到实战技巧全解析
python
会开花的二叉树1 小时前
彻底搞懂 Linux 基础 IO:从文件操作到缓冲区,打通底层逻辑
linux·服务器·c++·后端
再努力"亿"点点1 小时前
Sklearn(机器学习)实战:鸢尾花数据集处理技巧
开发语言·python
lizhongxuan1 小时前
Spec-Kit 使用指南
后端
费弗里1 小时前
无需云服务器!通过Plotly Cloud免费快捷部署Dash应用
python·dash
跟橙姐学代码1 小时前
轻松搞定 Python 模块与包导入:新手也能秒懂的入门指南
前端·python·ipython
会豪1 小时前
工业仿真(simulation)--发生器,吸收器,缓冲区(2)
后端