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秒执行一次

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/31014.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电脑怎么恢复出厂设置?系统还原怎么操作?就看这5个方法!

电脑怎么恢复出厂设置?如果您的电脑出现问题,在电脑上恢复出厂重置非常有用。它基本上可以重置电脑,使其恢复到下线时的状态,给你一个全新的开始。众所周知,我们使用电脑的时间越长,电脑上的文件和程序就会…

Vue3 + Element-plus + TS —— 动态表格自由编辑

前期回顾 《 穿越时空的代码、在回首:Evil.js两年后的全新解读 》-CSDN博客 Vue3 TS Element-Plus 封装Tree组件 《亲测可用》_ https://blog.csdn.net/m0_57904695/article/details/131664157?spm1001.2014.3001.5501 态表格 自由编辑 目录 ♻️ 效果图…

Edit Data. Create Cell Editors. Validate User Input

获取和修改代码中的单元格值 提醒:仅当网格及其列已完全初始化时,才使用以下方法。如果您需要在表单仍在加载时调用这些方法,请调用ForceInitialize()方法来强制Grid完成初始化。 单元格读取单元格值更改单元格值foc…

容易忘记,错题集

1、设计一个Per类&#xff0c;类中包含私有成员:姓名、年龄、指针成员身高、体重&#xff0c;再设计一个Stu类&#xff0c;类中包含私有成员:成绩、Per类对象p1&#xff0c;设计这两个类的构造函数、析构函数和拷贝构造函数 #include <iostream>using namespace std;cla…

AtomicInteger原理和CAS与Synchronized(juc编程)

AtomicInteger原理 4.6.1 原理介绍 AtomicInteger的本质&#xff1a;自旋锁 CAS算法 CAS的全成是&#xff1a; Compare And Swap(比较再交换); 是现代CPU广泛支持的一种对内存中的共享数据进行操作的一种特殊指令。CAS可以将read-modify-write转换为原子操作&#xff0c;这…

关于椭圆的方程(有Python画的动图)

关于椭圆的方程&#xff08;有Python画的动图&#xff09; flyfish 几何定义 椭圆是平面上所有到两个固定点&#xff08;焦点&#xff09;的距离之和为常数的点的集合。这两个固定点叫做焦点。 解析几何描述 设椭圆的两个焦点为 F 1 F_1 F1​ 和 F 2 F_2 F2​&#xff…

Pycharm 忽略文件

安装 .ignore插件 规则示例 罗列一些常遇到.getignore忽略规则的使用示例&#xff1a; 1. 在已忽略文件夹中不忽略指定文件夹&#xff1a; /libs/* !/libs/extend/ 2. 在已忽略文件夹中不忽略指定文件 /libs/* !/libs/extend/fastjson.jar 3.只忽略libs目录&#xf…

go context 源码刨析(二)

Context 上下文context.Context 是用来设置截止时间、同步信号&#xff0c;传递请求相关值的结构体。 context.Context 定义了四个需要实现的方法&#xff1a; Deadline: 返回 context.Context 被取消的时间。Done: 返回一个 Channel&#xff0c;这个 Channel 会在当前工作完…

【高等数学】傅里叶级数

最近刷了会抖音&#xff0c;看到一个非常有趣的现象&#xff1a;傅里叶级数&#xff0c;今天挑了几个视频来供大家学习。 1.傅里叶级数概念 【小崔说数】傅里叶级数专题https://www.bilibili.com/video/BV1Uq4y1q7xk?t117.4 2.傅里叶级数动画 【谜之舒适】12分钟的傅立叶级…

【docker】Dockerfile制作基础镜像 python 底层镜像制作 | 打包所有的requirement依赖

一、Dockerfile思想 我们正常的对一个项目进行打包 docker image 通常是在CI工具编译时进行对依赖的安装&#xff0c;比如golang的go get、python的pip install、node的npm install 等等 好处&#xff1a;我们更新了依赖可以动态的再编译时进行一个对依赖的更新 坏处&#xf…

转速传感器频率信号整形方波输出隔离变送器 地线干扰抑制 200mV~10V/0-12V/0-24V转0-5v/0-12v/0-24v/集电极输出

特点 转速传感器信号直接输入&#xff0c;方波信号输出正弦波、锯齿波信号输入&#xff0c;方波信号输出200mV峰值微弱信号的放大与整形不改变原波形频率&#xff0c;响应速度快电源、信号&#xff1a;输入/输出 3000VDC三隔离辅助电源&#xff1a;5V、12V、15V或24V直流单电源…

利用单线程池实现多线程并发顺序消费消息

1 背景 在某些场景下&#xff0c;我们需要保证消费消息的顺序性&#xff0c;可能要使用单线程处理任务。 这个在消息数量较少时&#xff0c;还是一个可行的方案&#xff0c;但在大量的数据消息情况下&#xff0c;单线程就显得力不从心了&#xff0c;所以这时候需要引入多线程。…

在4面体空间内2点结构占比

有一个4面体状空间&#xff0c;由3层甲烷状分子堆积而成&#xff0c;单个甲烷4面体边长10. 内有30个点&#xff0c;在30个点中取2点&#xff0c;有30*29/2435种取法。这里要求两个点的距离必须为6.123 在435个结构中只有40个符合要求 序数 结构 序数 结构 3 1 282 3 7…

利用 MyFlash 实现 MySQL 数据闪回

Github https://github.com/Meituan-Dianping/MyFlash MyFlash 限制 仅支持 5.6 与 5.7binlog 格式必须为 row&#xff0c;且 binlog_row_imagefull只能回滚DML&#xff08;增、删、改&#xff09; MySQL 准备 注&#xff1a; 本章 MySQL 是采用 Docker 部署&#xff0c;容器…

如何进行海外网络加速?告别卡顿与访问慢的方法

你是否经常在打开海外网站浏览网页时遇到响应缓慢的问题&#xff1f;或者在进行国际网络会议时&#xff0c;由于网络延迟影响与客户的交流&#xff1f;亦或是由于网络问题&#xff0c;导致OA、ERP、云储存等应用频繁因为数据包丢失而中断下载&#xff1f;如果你经常遇到这些问题…

centos7 离线安装zip和unzip

解压的时候发现不能解压&#xff0c;报-bash: unzip: command not found 1、访问https://www.rpmfind.net/linux/rpm2html/search.php?queryzip&submitSearch…&systemcentos&arch#/ 2、输入zip和centos搜索&#xff0c;选择el7下载 3、输入unzip和centos搜索&am…

显卡nvidia的CUDA和cuDNN的安装

显卡版本&#xff0c;和nvidia下载的 CUDA版本和CUDNN的关系 1. 显卡版本 nvidia-smi 硬件环境&#xff1a;显卡版本 4090 NVIDIA-SMI-555.85 我的驱动是510.85.02&#xff0c;驱动附带cuda12.5 2. nvidia下载的cuda版本 nvcc -V 我下载的是cuda12.5 cuda在安装版本过程…

【WPF编程宝典】第10讲:简单动画

1.基本动画 这些基本动画都应用与C#代码动画是WPF模型的核心部分&#xff0c;让动画动起来不需要使用计时器以及事件处理代码&#xff0c;可使用声明的方式创建动画。WPF动画第一条规则&#xff0c;每个动画都依赖于一个依赖项属性。WPF动画第二条规则&#xff0c;属性的动态化…

【Java 如何创建线程】

创建线程的方式一&#xff1a;继承Thread类 步骤&#xff1a; 定义一个类继承Thread类覆盖Thread类中的run&#xff08;&#xff09;方法直接创建Thread类的子类对象创建线程调用start方法开启线程并调用线程的任务run方法执行。 如果线程的目的是为了开启一条执行路径去运行…

互联网技术基础-计算机人必看

目录 1.Internet的工作原理 1、Internet是一个分组交换系统 2、路由器是Internet实现互连的“标准件” 3、TCP/IP是Internet的核心协议 4、客户机/服务器的工作模式 2. IP地址 2.1 IP地址分类 2.2特殊IP地址 2.3路由器和IP编制原则 2.4子网的划分 2.5 IPV6 3.域名系…