当前位置: 首页 > article >正文

Django 使用Apscheduler执行定时任务

APScheduler是一个轻量级的Python库,用于调度作业(运行定时任务)。在Django中使用APScheduler,你可以设置定时任务,比如每天定时发送报告,或者定时清理无效数据。

以下是一个简单的例子,展示如何在Django项目中使用APScheduler:

1.首先,安装APScheduler:

pip install apscheduler

2.在Django应用中创建一个任务文件,例如jobs.py:

from apscheduler.schedulers.background import BackgroundScheduler
import datetime
 
def my_job():
    print(f"任务执行:{datetime.datetime.now()}")
 
# 创建调度器
scheduler = BackgroundScheduler()
# 添加任务
scheduler.add_job(my_job, 'interval', minutes=1)
# 启动调度器
scheduler.start()

3.在Django的apps.py中启动调度器,确保在Django启动时任务能被加载:

from django.apps import AppConfig
from .jobs import scheduler
 
class MyAppConfig(AppConfig):
    name = 'my_app'
 
    def ready(self):
        # 当Django应用就绪时,启动调度器
        scheduler.start()

4.在__init__.py中设置AppConfig:

default_app_config = 'my_app.apps.MyAppConfig'

确保你的Django应用的名字替换成你实际的应用名。

以上代码将每分钟执行一次my_job函数。你可以根据需要调整任务的触发方式(例如,改变为每天或每小时一次)。记得在生产环境中部署时,确保调度器的启动逻辑只在一个进程中执行,避免多个进程执行相同任务的问题。

5.代码结构

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

6.代码优化:重复执行任务

INSTALLED_APPS = (
    # ...
    "django_apscheduler",
)
django_apscheduler_djangojob 表保存注册的任务以及下次执行的时间

django_apscheduler_djangojobexecution 保存每次任务执行的时间和结果和任务状态

在这里插入图片描述

# views.py
from django_apscheduler.jobstores import DjangoJobStore, register_job

from apscheduler.schedulers.blocking import BlockingScheduler
from datetime import datetime

scheduler = BlockingScheduler()  # 创建调度器
scheduler.add_jobstore(DjangoJobStore(), "default")


# 添加定时任务方式一
@register_job(scheduler, "interval", seconds=5, id="func", replace_existing=True, misfire_grace_time=120)
def job():
    print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))


# 添加定时任务方式二
def job1():
    print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))


scheduler.add_job(
    job1,
    'interval',
    seconds=5,
    id='my_job',  # 任务的唯一标识
    replace_existing=True,
)

scheduler.start()

http://www.kler.cn/news/283843.html

相关文章:

  • vue nginx部署 配置 解决href = ‘/login路由‘ 跳转404问题
  • 代码随想录刷题day17丨654.最大二叉树,617.合并二叉树,700.二叉搜索树中的搜索,98.验证二叉搜索树
  • Java线程生命周期详解_(1)
  • 在 Maven 的 POM 文件中配置 npm 镜像源
  • SpringMVC处理流程介绍
  • 【HuggingFace Transformers】BertSelfOutput 和 BertOutput源码解析
  • 开源个人云存储管理专家:Cloudreve
  • 零基础入门转录组数据分析——单基因ROC分析
  • Leetcode Java学习记录——动态规划基础_3
  • 尚硅谷大数据技术-Kafka视频教程-笔记01【Kafka 入门】
  • 8月30复盘日记
  • k8s-pod 实战四 什么是 Kubernetes Pod?如何在生产环境中使用它?(学习专场,实战就看这一篇就够了)
  • 把http网站变成https
  • WPF 使用PdfiumViewer实现PDF预览与打印
  • RabbitMQ本地Ubuntu系统环境部署与无公网IP远程连接服务端实战演示
  • element input限制输入框只能输入数字
  • 深入解析:文本分析模型性能评估的艺术与科学
  • 浅谈对分布式锁的认识
  • React中实现antd自定义图标,鼠标悬浮变色
  • Java算法之BogoSort(或称为Permutation Sort、Monkey Sort)
  • day39(了解docker-compose,docker-compose编排容器,配置harbor服务)
  • PneumoLLM: 利用大语言模型的力量进行尘肺病诊断| 文献速递-大模型与多模态诊断阿尔茨海默症与帕金森疾病应用
  • 数据的时光机:SQL中实现数据版本控制的策略
  • Go微服务开发框架DMicro的设计思路
  • Scala之高阶面向对象编程
  • 【NCom】:通用负压退火方法构建超高负载单原子催化剂库
  • Python 3.11 从入门到实战1(环境准备)
  • 鸿蒙XComponent组件的认识
  • FastJson序列化驼峰-下划线转换问题踩坑记录
  • 基于Spring Boot的文字识别系统