Django 使用Apscheduler执行定时任务
Apscheduler 介绍
核心组件: 调度器、作业存储、执行器、触发器
调度器
BlockingScheduler
阻塞的调度器,适用于脚本
BackgroundScheduler
后台调度器,适用于非阻塞的应用如Web应用
AsyncIOScheduler
适用于 asyncio 的调度器
GeventScheduler
适用于 Gevent 的调度器
TornadoScheduler
适用于 Tornado 的调度器
TwistedScheduler
适用于 Twisted 的调度器。
作业存储
保存作业的地方,默认是使用 内存存储,也可以持久化到数据库,支持redis、mongdb等
执行器
执行作业的工具,默认是ThreadPoolExecutor和ProcessPoolExecutor,也就是线程池和进程池
触发器
确定何时运行作业,主要有三种:date、interval、cron
date
在特定时间点运行一次,也就只运行一次
interval
按指定间隔运行,例如每五秒运行
cron
可支持复杂的规格,例如每天某个时间点执行,每周一执行等
更多详细介绍请转到官网
基本用法
1.创建调度器
from apscheduler.schedulers.background import BackgroundSchedulerscheduler = BackgroundScheduler()
2.具体的定时任务方法
def job_function(**kwargs):print(kwargs.get("name", "没有传递名称"))print(f"定时任务执行了:{kwargs.get('执行时间', datetime.now())}")
3.设置触发器
# scheduler.add_job(job_function, 'date', kwargs={"name": "张三", }, **{"run_date": datetime.now() + timedelta(seconds=1)})scheduler.add_job(job_function, 'interval', seconds=2)# scheduler.add_job(job_function, 'cron', **{"start_date": "2024-06-18 10:38:00", "end_date": "2024-06-18 10:38:20", "second": "*/2"})
4.运行定时任务
scheduler.start()
整体代码
from datetime import datetime
from apscheduler.schedulers.background import BackgroundSchedulerdef job_function(**kwargs):print(kwargs.get("name", "没有传递名称"))print(f"定时任务执行了:{kwargs.get('执行时间', datetime.now())}")scheduler = BackgroundScheduler()
# scheduler.add_job(job_function, 'date', kwargs={"name": "张三", }, **{"run_date": datetime.now() + timedelta(seconds=1)})# scheduler.add_job(job_function, 'interval', seconds=2)# scheduler.add_job(job_function, 'cron', **{"start_date": "2024-06-18 10:38:00", "end_date": "2024-06-18 10:38:20", "second": "*/2"})scheduler.add_job(job_function, 'cron', )
# scheduler.add_job(job_function, 'cron', **{"start_date": "2024-06-18 10:38:00", "end_date": "2024-06-18 10:38:20", "second": "*/2"})scheduler.start()while True:pass
触发器常用规则
可以使用对应的trigger对象进行建立对应的规则,也可以直接用简写方式
trigger对象
from apscheduler.triggers.date import DateTrigger
from apscheduler.triggers.interval import IntervalTrigger
from apscheduler.triggers.cron import CronTrigger
因为这些写法相对繁琐,博主更推荐用简写方式,所以就不详解展开介绍对象写法,就简单给出几个例子
sched.add_job(job_function, trigger=DateTrigger(run_date=datetime(2023, 10, 1, 10, 30)))
sched.add_job(job_function, trigger=IntervalTrigger(hours=2))
sched.add_job(job_function, trigger=CronTrigger(day_of_week='mon', hour='8,12', minute='30'))
add_job 可接收的参数
func, trigger=None, args=None, kwargs=None, id=None, name=None,
misfire_grace_time=undefined, coalesce=undefined, max_instances=undefined,
next_run_time=undefined, jobstore='default', executor='default',
replace_existing=False, **trigger_args
func 要运行的函数对象,注意是函数对象,不是函数名
args和kwargs是传递给需要执行函数的参数
**trigger_args 才是给触发器设置规则的参数
date 支持的规则
可以传入一个时间对象,或者是满足时间格式的字符串
时间对象:datetime.now()
scheduler.add_job(job_function, 'date', kwargs={"name": "张三",}, **{"run_date": datetime.now() + timedelta(seconds=1)})
效果:在当前时间再加一秒后执行
字符串:2024-06-18 10:02:00
scheduler.add_job(job_function, 'date', kwargs={"name": "张三",}, **{"run_date": "2024-06-18 10:02:00"})
效果:在2024-06-18 10:02:00执行
interval 支持的规则
weeks (int) – 间隔几周
days (int) – 间隔几天
hours (int) – 间隔几小时
minutes (int) – 间隔几分钟
seconds (int) – 间隔多少秒
start_date (datetime|str) – 开始日期
end_date (datetime|str) – 结束日期
timezone (datetime.tzinfo|str) – 时区
间隔*秒后执行
scheduler.add_job(job_function, 'interval', seconds=2)
效果:每两秒执行一次
cron 支持的规则
(int|str) 表示参数既可以是int类型,也可以是str类型
(datetime | str) 表示参数既可以是datetime类型,也可以是str类型
year (int|str) – 4-digit year -(表示四位数的年份,如2008年)
month (int|str) – month (1-12) -(表示取值范围为1-12月)
day (int|str) – day of the (1-31) -(表示取值范围为1-31日)
week (int|str) – ISO week (1-53) -(格里历2006年12月31日可以写成2006年-W52-7(扩展形式)或2006W527(紧凑形式))
day_of_week (int|str) – number or name of weekday (0-6 or mon,tue,wed,thu,fri,sat,sun) - (表示一周中的第几天,既可以用0-6表示也可以用其英语缩写表示)
hour (int|str) – hour (0-23) - (表示取值范围为0-23时)
minute (int|str) – minute (0-59) - (表示取值范围为0-59分)
second (int|str) – second (0-59) - (表示取值范围为0-59秒)
start_date (datetime|str) – earliest possible date/time to trigger on (inclusive) - (表示开始时间)
end_date (datetime|str) – latest possible date/time to trigger on (inclusive) - (表示结束时间)
timezone (datetime.tzinfo|str) – time zone to use for the date/time calculations (defaults to scheduler timezone) -(表示时区取值)
每周几执行
可以填写 0-6 或者 mon,tue.wed,thu,fri,sat,sun
scheduler.add_job(job_function, 'cron',**{"day_of_week": "mon"})
效果:每周一执行
每天固定时间执行
scheduler.add_job(job_function, 'cron',**{ hour='8, 12', minute='30'})
效果:每天早上8点30分和中午12点和30分运执行
每天时间范围内执行
scheduler.add_job(job_function, 'cron', **{"start_date": "2024-06-18 10:38:00", "end_date": "2024-06-18 10:38:20", "second": "*/2"})
效果:每天 2024-06-18 10:38:00 开始执行至2024-06-18 10:38:20 且每2秒执行一次
相关文章:
Django 使用Apscheduler执行定时任务
Apscheduler 介绍 核心组件: 调度器、作业存储、执行器、触发器 调度器 BlockingScheduler 阻塞的调度器,适用于脚本 BackgroundScheduler 后台调度器,适用于非阻塞的应用如Web应用 AsyncIOScheduler 适用于 asyncio 的调度器 GeventSchedu…...
Shopee API接口:获取搜索栏生成的商品结果列表
一、引言 此接口可以高效获取搜索栏生成的商品结果列表。本文将详细介绍这一核心功能,并探讨其在实际应用中的价值。 二、核心功能介绍——获取搜索栏生成的商品结果列表 请求API及返回示例 http://api.xxxx.com/sp/ll/search/item?keywordiphone&page1&am…...
选择门店收银系统要考虑哪些方面?美业系统Java源码分享私
开店前的一个重要事件就是选择门店收银软件/系统,尤其是针对美容、医美等美业门店,一个优秀专业的系统十分重要,它必须贴合门店的经营需求,提供更全面、便捷、高效的管理功能,帮助提升门店的服务质量和经营效益。 以下…...
智慧养老的养老方式及其技术实现与趋势
智慧养老是一种借助现代信息技术手段,为老年人提供更高效、便捷、个性化服务的养老模式。以下是一些常见的智慧养老方式: 1. 远程健康监测系统 通过智能穿戴设备,如手环、手表等,实时收集老年人的生理数据,如心率、血…...
思维导图之计算机网络整体框架
高清自行访问:计算机网络整体框架 (yuque.com)...
P7771 【模板】欧拉路径
网址如下: P7771 【模板】欧拉路径 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 忘掉了输出欧拉回路的方法,搞了我好久 关于欧拉回路的知识可以看我之前的博客: 一点关于欧拉回路的总结-CSDN博客 代码如下: #include<q…...
卷积神经网络(CNN)理解
1、引言(卷积概念) 在介绍CNN中卷积概念之前,先介绍一个数字图像中“边缘检测edge detection”案例,以加深对卷积的认识。图中为大小8X8的灰度图片,图片中数值表示该像素的灰度值。像素值越大,颜色越亮&…...
Databend 开源周报第 149 期
Databend 是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。 支持递归公共表…...
Hue Hadoop 图形化用户界面 BYD
软件简介 Hue 是运营和开发 Hadoop 应用的图形化用户界面。Hue 程序被整合到一个类似桌面的环境,以 web 程序的形式发布,对于单独的用户来说不需要额外的安装。...
【经验分享】RT600 serial boot mode测试
【经验分享】RT600 serial boot mode测试 一, 文档描述二, Serial boot mode测试2.1 evkmimxrt685_gpio_led_output 工程测试2.2 evkmimxrt685_dsp_hello_world_usart_cm33工程测试 一, 文档描述 RT600的启动模式共支持4种: 1&am…...
七种不同类型测宽仪技术参数 看看哪种能用于您的产线?
在线测宽仪种类众多,原理不同,产品不同,型号不同,其技术参数也各不相同。不同的测量范围与测量精度,适用于不同规格的板材,看看您的板材能适用于哪种范围。 1、单测头平行光测宽仪 点光源发射的光经过发射…...
【GO】rotatelogs库和sirupsen/logrus库实现日志功能的实践用例
“github.com/sirupsen/logrus” 是一个 Go 语言的日志库,它提供了一种简单、灵活的方式来记录日志。该库的主要特点包括: 支持多种日志输出目标,如控制台、文件等。 支持日志轮转,可以按照时间或文件大小进行轮转。 支持日志格式…...
Arc2Face - 一张图生成逼真的多风格人脸,本地一键整合包下载
Arc2Face是用于人脸的基础模型训练,可批量生成超高质量主题的AI人脸艺术风格照,完美复制人脸。只需一张照片,几秒钟,即可批量生成超高质量主题的AI人脸艺术风格照,完美复制人脸。 Arc2Face 是一个创新的开源项目&…...
swiper 幻灯片
index.html <!DOCTYPE html> <html lang"en"> <head> <meta charset"utf-8"> <title>swiper全屏响应式幻灯片代码</title> <meta name"viewport" content"widthdevice-width, initial-scale1, min…...
Ubuntu 使用Vscode的一些技巧 ROS
Ubuntu VSCode的一些设置(ROS) 导入工作空间 推荐只导入工作空间下的src目录 如果将整个工作空间导入VSCode,那么这个src就变成了次级目录,容易在写程序的时候把本应该添加到具体工程src目录里的代码文件给误添加到这个catkin_w…...
JS中的三种事件模型
JavaScript 中的事件模型主要有三种: 传统事件模型(DOM Level 0)标准事件模型(DOM Level 2)IE 事件模型(非标准,仅限于旧版本的 Internet Explorer) 下面分别介绍这三种事件模型&…...
南京邮电大学计算机网络实验二(网络路由器配置RIP协议)
文章目录 一、 实验目的和要求二、 实验环境(实验设备)三、 实验步骤四、实验小结(包括问题和解决方法、心得体会、意见与建议等)五、报告资源 一、 实验目的和要求 掌握思科路由器的运行过程,掌握思科路由器的硬件连线与接口,掌…...
仓颉语言的编译和构建
一、cjc 使用 cjc是仓颉编程语言的编译命令,其提供了丰富的功能及对应的编译选项,本章将对基本使用方法进行介绍。 cjc-frontend (仓颉前端编译器)会随 cjc 一起通过 Cangjie SDK 提供,cjc-frontend 能够将仓颉源码编…...
网络基础-协议
一、ARP 通过IP得到Mac 首先会查看缓存的arp表中是否有相应的IP和Mac对应关系,如果有直接进行包封装。如果没有则进行广播当对应的地址就收到广播包后会根据arp中的源地址进行单播返回相应的IP和Mac对应关系。 arp -a 查看现有的arp缓存 二、RARP反向地址解析 通过…...
电子设备抗震等级与电子设备震动实验
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/139923445 红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软…...
从零搭建静态博客:Hugo + GitHub Pages 全流程实战指南
1. 项目概述:一个静态博客的诞生与进化 如果你在GitHub上搜索过个人博客的源码,大概率会见过类似 username/username.github.io 这样的仓库名。 Yucco-K/yucco-k.github.io 就是这样一个典型的、以GitHub Pages为宿主的个人静态博客项目。乍一看&am…...
开源机械爪应用宝库:从视觉分拣到项目实战全解析
1. 项目概述:一个开源“机械爪”用例的灵感宝库如果你对机器人、自动化或者开源硬件感兴趣,最近在GitHub上闲逛时,可能刷到过一个叫hesamsheikh/awesome-openclaw-usecases的仓库。光看名字,就能猜个八九不离十:这是一…...
英矽智能对标宁德时代,AI 制药规模化复制难题待解!
AI 制药巨头“朋友圈”扩大AI 制药巨头的“朋友圈”越来越大了。“港股 AI 制药一哥”英矽智能日前宣布与谷歌云达成战略合作,要把 Gemini 大模型塞进自家 Pharma.AI 平台。这意味着英矽智能已不再满足于做一家“卖算法的”公司,而是要把自己变成药物发现…...
嵌入式开发中的模拟信号处理:ADC、DAC与PWM核心原理与CircuitPython实战
1. 项目概述:从数字世界到物理世界的桥梁在嵌入式开发的世界里,我们写的代码最终是要和物理世界打交道的。物理世界是连续的、模拟的——光线强弱、温度高低、声音大小,这些都不是简单的“开”或“关”,而是平滑变化的连续量。而我…...
ARM架构CPACR与SCR寄存器详解与应用
1. ARM架构系统控制寄存器概述在ARMv8/v7架构中,系统控制寄存器(System Control Registers)是处理器核心功能配置的关键组件,它们直接控制着处理器的运行状态、安全机制和硬件资源访问权限。这些寄存器通常通过协处理器CP15进行访问(在AArch3…...
高性能云端GPU推荐,满足深度学习全场景需求
本文以安诺其集团旗下专业GPU算力平台“智星云”为样本,从其技术架构、全系型号定价、主流平台对比、全场景适配四个维度展开,聚焦一个核心问题:在算力价格全线上涨的2026年,高性能深度学习任务如何用合理的预算匹配最合适的GPU方…...
Beige CSS框架:现代CSS Grid与变量驱动的极简前端开发实践
1. 项目概述:一个被低估的现代CSS框架如果你和我一样,在过去的几年里,已经厌倦了Bootstrap、Tailwind CSS这些“巨无霸”框架带来的审美疲劳和项目同质化,同时又对从零开始手写CSS的繁琐感到头疼,那么今天聊的这个项目…...
换背景颜色怎么操作?5分钟掌握证件照、商品图换底色的完整指南
最近有不少朋友问我,证件照背景太丑怎么办?电商产品图背景杂乱怎么处理?其实换背景颜色没有想象中那么复杂,今天就把我用过的所有方法和工具整理出来,帮你彻底解决这个问题。为什么要学会换背景颜色先说说我为什么突然…...
微信网页版访问终极指南:如何用wechat-need-web插件轻松解锁微信网页版
微信网页版访问终极指南:如何用wechat-need-web插件轻松解锁微信网页版 【免费下载链接】wechat-need-web 让微信网页版可用 / Allow the use of WeChat via webpage access 项目地址: https://gitcode.com/gh_mirrors/we/wechat-need-web 还在为微信网页版无…...
高光谱图像分类避坑指南:Hughes现象、同物异谱,这些坑你踩过吗?
高光谱图像分类实战避坑手册:从Hughes现象到模型优化的深度解析 当你的高光谱分类模型在验证集上表现优异,却在真实场景中频频失误时,或许正遭遇着这个领域特有的"暗礁"。不同于常规RGB图像分类,高光谱数据特有的图谱合…...
