Python中schedule库:轻松实现任务定时自动化

在Python的自动化工具库中,schedule是一个简洁又强大的存在。无论是定时备份数据、周期性抓取网页,还是定期发送提醒邮件,schedule库都能让我们的代码按计划精准执行。今天我们就深入了解schedule库的使用,助我们成为任务调度小能手!

schedule库核心函数速览

schedule库通过极简的语法,实现复杂的定时任务配置。使用前先通过pip命令安装schedule库:pip install schedule

其核心函数和方法如下:

1. schedule.every():创建基础调度任务

功能:开启一个新的调度任务,后续可链式调用时间单位和执行函数。

案例:创建一个每分钟执行一次的任务框架。

复制代码
import schedule
# 创建1个调度任务,默认参数为1
schedule.every()

2. 时间单位设置函数

功能:指定任务执行的时间间隔的属性函数:seconds**、** minutes**、** hours**、** days**、** weeks**、**monday、tuesday、wednesday、thursday、friday、saturday、sunday

案例:设置每5分钟执行一次的任务。

复制代码
importschedule
# 每5分钟执行一次任务 every函数参数填5,后续跟着minutes,表示每5分钟
schedule.every(5).minutes.do(task_function)

# 每2小时执行一次任务 
schedule.every(2).hours.do(task_function)

# 每3天执行一次任务
schedule.every(3).days.do(task_function)

# 每周执行一次任务
schedule.every().weeks.do(task_function)
# 每2周执行一次任务
schedule.every(2).weeks.do(task_function)

# 每周1执行一次任务
schedule.every().monday.do(task_function)

# 每周1和周3执行一次任务
schedule.every().monday.wednesday.do(task_function)
#或者分开两个任务
schedule.every().monday.do(task_function)
schedule.every().wednesday.do(task_function)

3. at():精准设置任务执行的具体时间点

功能:在指定的时间点执行任务,常与时间周期函数(如days()、weeks())结合使用,支持设置时、分,格式为HH:MM(24 小时制) 。通过at功能,可以实现 "每天早上 9 点""每周五下午5点" 等精确的定时需求。

参数:time_str接受一个字符串类型参数,即具体时间点,如"09:00"、"17:30" 。tz默认为None,默认采用当前时区。如果传入时区时需要安装pytz库。

复制代码
#每天早上9点执行
schedule.every().day.at("09:00").do(task_function)

#每周1早上9点执行
schedule.every().monday.at("09:00").do(task_function)

#在东京时区 每周1早上9点执行
schedule.every().monday.at("09:00","Asia/Tokyo").do(task_function)

4. do():指定要执行的函数

功能:关联具体的Python函数,在达到设定时间时执行。

案例:执行打印当前时间的函数

复制代码
import schedule
import time
def print_current_time():
    print(time.strftime("%Y-%m-%d %H:%M:%S"))
# 每10秒打印一次当前时间
schedule.every(10).seconds.do(print_current_time)

5. run_pending():检查并执行待处理任务

功能:检查是否有到期任务,若有则执行,需在循环中持续调用。

案例 :持续运行任务调度循环

复制代码
import schedule
import time
def task():
    print("任务执行!")
schedule.every(2).seconds.do(task)
while True:
    schedule.run_pending()

6. clear():清除所有任务

功能:删除所有已设置的调度任务。

案例:清空所有定时任务

复制代码
import schedule
# 设置两个任务
schedule.every(1).minutes.do(task1)
schedule.every(2).minutes.do(task2)
# 清空所有任务
schedule.clear()

7. cancel_job(job):取消特定任务

功能:移除指定的调度任务,job为do()方法的返回值。

案例:取消特定任务

复制代码
import schedule
def task():
    print("任务执行!")
job = schedule.every(3).seconds.do(task)

#取消任务
schedule.cancel_job(job)

二、案例

案例 1:定时发送邮件提醒

复制代码
import schedule
import time
import smtplib
from email.mime.text import MIMEText
def send_email():
    msg = MIMEText('这是定时发送的邮件提醒!', 'plain', 'utf-8')
    msg['Subject'] = '定时邮件'
    msg['From'] = 'xxx@xxx.com'
    msg['To'] ='xxx@xxx.com'
    try:
        server = smtplib.SMTP('smtp.qq.com', 587)
        server.starttls()
        server.login(msg['From'], 'xxxpassword')
        server.sendmail(msg['From'],msg['To'], msg.as_string())
        server.quit()
        print("邮件发送成功!")
    except Exception as e:
        print(f"邮件发送失败: {e}")
# 每天早上8点发送邮件
schedule.every().day.at("08:00").do(send_email)
while True:
    schedule.run_pending()
    time.sleep(1)

案例 2:实现定时数据库备份

复制代码
import schedule
import time
import subprocess
def backup_data():
    backup_command = "mysqldump -u username -ppassword database_name > backup.sql"
    try:
        subprocess.run(backup_command, shell=True, check=True)
        print("数据库备份成功!")
    except subprocess.CalledProcessError as e:
        print(f"数据库备份失败: {e}")
# 每隔2天执行一次数据备份任务
schedule.every(2).days.do(backup_data)
while True:
    schedule.run_pending()
    time.sleep(1)

三、避坑指南

循环阻塞问题

问题:schedule.run_pending()需在循环中调用,但循环可能会阻塞主线程。

解决:可以使用多线程或多进程运行调度循环,避免影响其他程序执行。例如:

复制代码
import schedule
import time
import threading
def run_schedule():
    while True:
        schedule.run_pending()
        time.sleep(1)
# 启动调度循环线程 不影响主线程
schedule_thread = threading.Thread(target=run_schedule)
schedule_thread.start()

2.时区与时间格式

问题:使用at()方法设置时间时,默认使用系统时区,可能与预期不符。

解决:如需跨时区调度,可结合pytz库进行时区转换,确保时间准确。

一些常用见时区:

  1. 亚洲时区:Asia/Shanghai:中国上海(北京时间)

Asia/Tokyo:日本东京时区

Asia/Kolkata:印度加尔各答时区

2. 美洲时区:America/New_York:美国纽约时区

America/Los_Angeles:美国洛杉矶时区

America/Toronto:加拿大多伦多时区

  1. 欧洲时区:Europe/London:英国伦敦时区

Europe/Paris:法国巴黎时区

Europe/Moscow:俄罗斯莫斯科时区

4. 大洋洲时区:Australia/Sydney:澳大利亚悉尼时区

Pacific/Auckland:新西兰奥克兰时区

5. 非洲时区:Africa/Cairo:埃及开罗时区

Africa/Johannesburg:南非约翰内斯堡时区

掌握schedule库的这些要点,我们就就能轻松实现各类任务的定时自动化。无论是个人项目还是工作中的流程优化,它都能成为你的得力助手!如果在使用过程中遇到问题,欢迎在评论区留言交流,谢谢大家的阅读!

相关推荐
努力努力再努力wz2 小时前
【Linux网络系列】深入理解 I/O 多路复用:从 select 痛点到 poll 高并发服务器落地,基于 Poll、智能指针与非阻塞 I/O与线程池手写一个高性能 HTTP 服务器!(附源码)
java·linux·运维·服务器·c语言·c++·python
努力努力再努力wz2 小时前
【Linux网络系列】万字硬核解析网络层核心:IP协议到IP 分片重组、NAT技术及 RIP/OSPF 动态路由全景
java·linux·运维·服务器·数据结构·c++·python
tjc199010052 小时前
golang如何使用t.Cleanup清理测试_golang t.Cleanup测试清理使用策略
jvm·数据库·python
小糖学代码2 小时前
LLM系列:2.pytorch入门:3.基本优化思想与最小二乘法
人工智能·python·算法·机器学习·ai·数据挖掘·最小二乘法
21439652 小时前
如何提升SQL数据更新的安全性_使用行级锁与悲观锁机制
jvm·数据库·python
叶子丶苏2 小时前
第二节_机器学习基本知识点
人工智能·python·机器学习·数据科学
SHoM SSER2 小时前
SQL之CASE WHEN用法详解
数据库·python·sql
2401_835956812 小时前
Golang怎么做代码热更新_Golang热更新教程【精通】
jvm·数据库·python
justjinji2 小时前
如何解决Oracle JDBC驱动版本的兼容性问题_ojdbc8.jar与JDK版本的对应关系
jvm·数据库·python