Python中定时任务调度利器APScheduler

在Python开发中,经常需要执行一些定时任务,比如定期发送邮件、定期更新数据等。APScheduler(Advanced Python Scheduler)是一个强大且易用的Python库,专门用于定时任务调度。它提供了丰富的调度接口,使得定时任务的设置和执行变得非常简单。本文将介绍APScheduler的基本用法和常见场景。

一、安装APScheduler

首先,你需要通过pip安装APScheduler:

pip install apscheduler

二、基本用法

在这里插入图片描述

APScheduler的基本用法包括创建调度器、添加定时任务以及启动调度器。

创建调度器

APScheduler提供了多种调度器,包括BlockingSchedulerBackgroundSchedulerAsyncIOSchedulerGeventSchedulerTwistedScheduler。根据你的应用场景选择合适的调度器。例如,如果你在一个脚本中使用APScheduler并且希望脚本阻塞直到所有任务完成,那么应该使用BlockingScheduler

from apscheduler.schedulers.blocking import BlockingScheduler  
  
scheduler = BlockingScheduler()

添加定时任务

你可以使用add_job方法来添加定时任务。这个方法接受多个参数,包括任务函数、触发方式(如间隔触发、定时触发等)以及其他可选参数。

def my_job():  
    print("Hello, world!")  
  
# 每隔5秒执行一次my_job函数  
scheduler.add_job(my_job, 'interval', seconds=5)

启动调度器

在添加完所有任务后,你需要调用调度器的start方法来启动它。对于BlockingScheduler,这将导致程序阻塞直到你显式地停止调度器。

scheduler.start()

三、触发方式

APScheduler支持多种触发方式,包括:

  • interval:固定时间间隔触发
  • date:在特定日期或时间触发一次
  • cron:在特定时间(类似cron表达式)触发

使用cron触发方式可以灵活地设置任务的执行时间,例如每天上午9点执行某个任务:

from datetime import datetime  
from apscheduler.schedulers.blocking import BlockingScheduler  
  
def my_scheduled_job():  
    print(f"I'm working... {datetime.now()}")  
  
scheduler = BlockingScheduler()  
scheduler.add_job(my_scheduled_job, 'cron', hour=9, minute=0)  
scheduler.start()

四、常见场景

APScheduler可以应用于多种场景,例如:

  • 定期发送邮件:你可以使用APScheduler来定期发送邮件报告或通知。
  • 定期更新数据:对于需要从外部数据源定期获取或更新数据的应用,APScheduler可以帮助你实现这一点。
  • 周期性任务:任何需要周期性执行的任务,如数据备份、日志轮转等,都可以使用APScheduler来管理。

五、代码示例

示例一:简单间隔触发

每隔5秒打印一条消息。

from apscheduler.schedulers.blocking import BlockingScheduler  
  
def job():  
    print("这个任务每隔5秒执行一次")  
  
scheduler = BlockingScheduler()  
scheduler.add_job(job, 'interval', seconds=5)  
scheduler.start()

示例二:固定日期触发

在指定的日期和时间执行一次任务。

from apscheduler.schedulers.blocking import BlockingScheduler  
from datetime import datetime  
  
def job():  
    print("这个任务在指定日期和时间执行")  
  
# 设置任务执行的时间  
run_date = datetime(2023, 10, 27, 14, 30, 0)  
  
scheduler = BlockingScheduler()  
scheduler.add_job(job, 'date', run_date=run_date)  
scheduler.start()

示例三:Cron表达式触发

每天上午9点执行一个任务。

from apscheduler.schedulers.blocking import BlockingScheduler  
  
def job():  
    print("这个任务每天上午9点执行")  
  
scheduler = BlockingScheduler()  
scheduler.add_job(job, 'cron', hour=9, minute=0)  
scheduler.start()

示例四:带有参数的任务

在任务中传递参数。

from apscheduler.schedulers.blocking import BlockingScheduler  
  
def greet(name):  
    print(f"你好, {name}!")  
  
scheduler = BlockingScheduler()  
scheduler.add_job(greet, 'interval', seconds=10, args=['张三'])  
scheduler.start()

示例五:异步调度器

使用异步调度器来执行异步任务。

import asyncio  
from apscheduler.schedulers.asyncio import AsyncIOScheduler  
  
async def async_job():  
    print("这是一个异步任务")  
    await asyncio.sleep(1)  # 模拟异步IO操作  
  
scheduler = AsyncIOScheduler()  
scheduler.add_job(async_job, 'interval', seconds=3)  
scheduler.start()  
  
# 运行事件循环  
try:  
    asyncio.get_event_loop().run_forever()  
except (KeyboardInterrupt, SystemExit):  
    pass

示例六:使用装饰器添加任务

使用装饰器来简化任务添加过程。

from apscheduler.schedulers.blocking import BlockingScheduler

scheduler = BlockingScheduler()


@scheduler.scheduled_job('interval', seconds=5)
def timed_job():
    print("这个任务每隔5秒执行一次")


scheduler.start()

示例七:移除任务

动态添加和移除任务。

from apscheduler.schedulers.blocking import BlockingScheduler


def job():
    print("这个任务正在执行")


scheduler = BlockingScheduler()
job = scheduler.add_job(job, 'interval', seconds=5)
print("job_id:", job.id)
try:
    # 运行一段时间
    scheduler.start()
except (KeyboardInterrupt, SystemExit):
    scheduler.remove_job(job.id)
    print("任务已移除")

示例八:暂停和恢复任务

首先,我们需要创建一个调度器并添加一个任务。然后,我们可以使用任务的ID来暂停和恢复它。

import time
from apscheduler.schedulers.blocking import BlockingScheduler
from threading import Thread


def my_job():
    print("这个任务正在执行")


# 创建调度器实例
scheduler = BlockingScheduler()

# 添加任务,并获取任务ID
job = scheduler.add_job(my_job, 'interval', seconds=3)

print("任务已添加,开始执行...")


def monitor_task(job_id):
    time.sleep(10)
    print("暂停任务...")
    scheduler.pause_job(job_id)
    print("任务已暂停")
    time.sleep(10)
    # 再过一段时间后,我们想要恢复任务
    input("按恢复任务...")
    scheduler.resume_job(job_id)
    print("任务已恢复")
    time.sleep(10)
    # 等待用户输入来关闭调度器
    input("退出...")
    scheduler.shutdown()

try:
    th = Thread(target=monitor_task, args=(job.id, ))
    th.start()
    # 启动调度器
    scheduler.start()
except (KeyboardInterrupt, SystemExit):
    # 清理调度器
    scheduler.shutdown()


在这个示例中,我们首先创建了一个BlockingScheduler实例,并添加了一个每3秒执行一次的任务my_job。我们保存了任务的ID,以便稍后可以使用它来暂停和恢复任务。

当调度器开始运行时,它会不断地执行我们的任务。我们通过input函数等待用户输入来模拟在某个时刻暂停和恢复任务的情况。当用户按下任意键时,我们调用pause_job方法来暂停任务,并打印出相应的消息。之后,再次等待用户输入来恢复任务,我们调用resume_job方法并打印出恢复的消息。

请注意,BlockingScheduler会在其start方法被调用后阻塞当前线程,直到调度器被关闭。因此,在上面的示例中,我们使用input函数来等待用户输入,以便可以在不关闭整个程序的情况下与调度器进行交互。在实际应用中,你可能会使用其他方法来处理用户输入或事件,比如使用网络请求、图形用户界面(GUI)等。

最后,通过调用shutdown方法来清理调度器并安全地退出程序。这在实际应用中是非常重要的,以确保资源得到正确的释放。

六、注意事项

  • 当使用BlockingScheduler时,确保你的主程序逻辑在启动调度器之后。
  • 对于需要长时间运行的任务,考虑使用异步调度器(如AsyncIOScheduler)以避免阻塞主线程。
  • 在生产环境中,确保正确处理任何可能由定时任务抛出的异常。

七、总结

APScheduler是一个功能强大且易于使用的Python库,它使得定时任务的设置和执行变得简单高效。无论是简单的定时任务还是复杂的周期性任务,APScheduler都能提供灵活且可靠的解决方案。通过掌握其基本用法和常见场景,你可以轻松地将定时任务集成到你的Python应用中。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

51单片机学习笔记14 LCD1602显示屏使用

51单片机学习笔记14 LCD1602显示屏使用 一、LCD1602介绍1. 简介2. 引脚定义3. DDRAM4. 字模5. 指令(1)清屏指令 0x01(2)光标归位指令 0x02(3)进入模式设置指令 0x06(4)显示开关控制指…

短毛猫也能吃得好!揭秘宠物店推荐猫粮的秘密!

短毛猫通常毛发短而浓密,性格温顺,容易打理。那么,对于我们这些爱护短毛猫的朋友们来说,选择一款合适的猫粮就显得尤为重要了。今天,我要向大家推荐一款我个人非常喜欢的猫粮——福派斯三文鱼益生菌猫粮。 &#x1f41…

SAP操作教程第7期:SAP B1日期偏离允许范围解决方法

作为一种灵活的工具,自定义能够充分满足企业多样的需求。它允许你根据个人或团队的具体需求和情况来调整计划。通过自定义,你可以根据优先级、时间表、资源分配和风险管理等因素,制定更具体、实用的计划。 下面我们将详细探讨在SAP Business …

ARM_04

1.总结二进制信号量和计数型信号量的区别,以及他们的使用场景。 二进制信号量:只有0和1,一般用于资源共享时使用 计数型信号量:值一般是大于等于2的,可以实现同步互斥作用 2.使用技术型信号量完成生产者和消费者模型…

vue快速入门(九)事件绑定参数传递

注释很详细&#xff0c;直接上代码 上一篇 新增内容 事件绑定基础模板事件传参方法 源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, init…

蓝桥杯嵌入式(G431)备赛笔记——LED

目录 cubeMX配置&#xff1a; 代码模板&#xff1a; 注意&#xff1a; cubeMX配置&#xff1a; 原理图&#xff0c;其中PD2高电平使能锁存器&#xff0c;PC8-15默认给高电平&#xff0c;放置上电初始化LED亮 74HC573是八路输出锁存器 1脚是使能&#xff0c;低电平有效&#…

【JavaEE】浅谈线程(一)

线程 前言线程的由来线程是什么线程的属性线程更高效的原因举个例子&#xff08;线程便利性的体现&#xff09; 多线程代码线程并发执行的代码jconsole(观测多线程) 线程的调度问题创建线程的几种方法1&#xff09;通过继承Thread 重写run2&#xff09;使用Runnable接口 重写ru…

Ubuntu系统同时使用AMD和NVIDIA GPU出现的问题及解决

问题产生&#xff1a; Ubuntu 22.04系统同时使用了AMD W7900和NVIDIA GTX 1070Ti&#xff0c;想用1070Ti做显示&#xff0c;W7900做运算。结果Ubuntu 22.04系统不能启动了。 解决方法&#xff1a; 同时按下Ctrl和Alt键&#xff0c;并保持按住。在此过程中&#xff0c;按一下…

Windows Server 2012 R2安装远程桌面服务

文章目录 一、打开【服务器管理器】二、点击【添加角色和功能】三、点击【下一步】四、点击【下一步】五、点击【下一步】![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/05b61a830faf477e81f858ec00bbdfff.png)六、勾选【远程桌面服务】→点击【下一步】七、点击【…

ruoyi-nbcio-plus基于vue3的flowable流程设计器组件的升级修改

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…

删除有序链表中的重复元素

. - 力扣&#xff08;LeetCode&#xff09; 给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,3,4,4,5] 输出&#xff1a;[1,2,5]示例 2&…

软考系统规划与管理师-第1章考点思维导图

系规&#xff5c;教程第1章脑图发布&#xff0c;用4幅图掌控信息系统综合知识的考点地图 2024年指尖疯在9年之后&#xff0c;首次扩展到系规课程。 虽然目前系统规划与管理师的教程是否改版存在不确定性&#xff0c;但是不影响咱们先概要了解当前的教程&#xff0c;使用思维导图…

Python实现 AI 绘图(非常详细)零基础入门到精通,收藏这一篇就够了

今天给大家带来了 Python 对接阿里大模型&#xff0c;通过 AI 实现文本生成图片。 相关资料 这个功能使用的主要 API 是阿里的大模型服务。 开通服务 阿里文档 https://help.aliyun.com/zh/dashscope/developer-reference/quick-start-1?disableWebsiteRedirecttrue 获取 a…

阿里云4核8G服务器ECS通用算力型u1实例优惠价格

阿里云4核8G服务器优惠价格955元一年&#xff0c;配置为ECS通用算力型u1实例&#xff08;ecs.u1-c1m2.xlarge&#xff09;4核8G配置、1M到3M带宽可选、ESSD Entry系统盘20G到40G可选&#xff0c;CPU采用Intel(R) Xeon(R) Platinum处理器&#xff0c;阿里云活动链接 aliyunfuwuq…

DFS:floodfill算法解决矩阵联通块问题

floodfill&#xff0c;翻译为洪水灌溉&#xff0c;而floodfill算法本质上是为了解决在矩阵中性质相同的联通块问题。 一、图像渲染 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int dx[4]{0,0,1,-1};int dy[4]{1,-1,0,0};int prev;//记住初始值int m,…

内容检索(2024.04.07)

随着创作数量的增加&#xff0c;博客文章所涉及的内容越来越庞杂&#xff0c;为了更为方便地阅读&#xff0c;后续更新发布的文章将陆续在此汇总并附上原文链接&#xff0c;感兴趣的小伙伴们可持续关注文章发布动态&#xff01; 本期更新内容&#xff1a; 1. 真实案例分享--P…

能不能换DB吗?--抽象工厂模式

1.1 就不能不换DB吗&#xff1f; 都是换数据库惹的祸。 "我们团队前段时间用.net的C#来开发好一个项目&#xff0c;是给一家企业做的电子商务网站&#xff0c;是用SQL Server作为数据库的&#xff0c;应该说上线后除了开始有些小问题&#xff0c;基本都还可以。而后&#…

政安晨:【Keras机器学习实践要点】(十八)—— 利用视觉转换器进行图像分类

目录 简介 设置 准备数据 配置超参数 使用数据增强 实施多层感知器&#xff08;MLP&#xff09; 将创建修补程序作为一个层 实施补丁编码层 建立 ViT 模型 编译、培训和评估模式 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: T…

Android源码笔记-输入事件(二)

这一节主要了解输入事件的获取&#xff0c;InputReaderThread继承自C的Thread类&#xff0c;Thread类封装了pthread线程工具&#xff0c;提供了与Java层Thread类相似的API。C的Thread类提供了一个名为threadLoop()的纯虚函数&#xff0c;当线程开始运行后&#xff0c;将会在内建…

【Linux实践室】Linux高级用户管理实战指南:创建与删除用户组操作详解

&#x1f308;个人主页&#xff1a;聆风吟_ &#x1f525;系列专栏&#xff1a;Linux实践室、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. ⛳️任务描述二. ⛳️相关知识2.1 &#x1f514;Linux创建用户组命令2.1.1 知识点讲解2.1.2…