使用dbader/schedule库实现Python定时任务详解
schedule Python job scheduling for humans. 项目地址: https://gitcode.com/gh_mirrors/sc/schedule
定时任务是开发中常见的需求,Python中的schedule库提供了简单易用的定时任务调度功能。本文将详细介绍如何使用schedule库实现各种定时任务场景。
基础定时任务设置
schedule库支持多种时间单位的定时任务设置,包括秒、分钟、小时、天和周等。下面是一个基础示例:
import schedule
import time
def job():
print("任务执行中...")
# 每3秒执行一次
schedule.every(3).seconds.do(job)
# 每3分钟执行一次
schedule.every(3).minutes.do(job)
# 每3小时执行一次
schedule.every(3).hours.do(job)
# 每天10:30执行
schedule.every().day.at("10:30").do(job)
# 每周一执行
schedule.every().monday.do(job)
while True:
schedule.run_pending()
time.sleep(1)
使用装饰器简化定时任务
schedule库提供了@repeat
装饰器,可以更简洁地定义定时任务:
from schedule import every, repeat, run_pending
import time
@repeat(every(10).minutes)
def scheduled_job():
print("这是一个定时任务")
while True:
run_pending()
time.sleep(1)
注意:装饰器方式不支持非静态类方法。
任务参数传递
可以向定时任务传递参数:
def greet(name):
print('你好', name)
# 传递固定参数
schedule.every(2).seconds.do(greet, name='张三')
# 装饰器方式传递参数
@repeat(every().day, "世界")
def hello(planet):
print("你好", planet)
任务管理
schedule提供了丰富的任务管理功能:
- 取消单个任务:
job = schedule.every().day.at('22:30').do(some_task)
schedule.cancel_job(job)
- 任务只执行一次:
def one_time_job():
# 只执行一次的工作
return schedule.CancelJob
schedule.every().day.at('22:30').do(one_time_job)
- 获取所有任务:
all_jobs = schedule.get_jobs()
- 取消所有任务:
schedule.clear()
高级功能
标签管理任务组
可以为任务添加标签,然后批量管理:
# 添加标签
schedule.every().day.do(task1).tag('daily', 'important')
schedule.every().hour.do(task2).tag('hourly', 'important')
# 获取特定标签的任务
important_tasks = schedule.get_jobs('important')
# 取消特定标签的任务
schedule.clear('daily')
随机间隔执行
实现任务在指定范围内随机间隔执行:
# 每5到10秒随机执行一次
schedule.every(5).to(10).seconds.do(my_job)
设置任务截止时间
可以设置任务的执行截止时间:
from datetime import datetime, timedelta, time
# 执行到今日18:30
schedule.every(1).hours.until("18:30").do(job)
# 执行到特定日期时间
schedule.every(1).hours.until(datetime(2023,12,31,23,59)).do(job)
# 执行未来8小时
schedule.every(1).hours.until(timedelta(hours=8)).do(job)
获取下次执行时间
seconds_until_next_job = schedule.idle_seconds()
if seconds_until_next_job > 0:
time.sleep(seconds_until_next_job)
立即执行所有任务
# 立即执行所有任务
schedule.run_all()
# 带延迟的立即执行
schedule.run_all(delay_seconds=10) # 每个任务间隔10秒
最佳实践
- 在主循环中总是包含
time.sleep(1)
,避免CPU占用过高 - 对于长时间运行的任务,考虑使用线程或进程避免阻塞
- 生产环境中建议结合日志记录任务执行情况
- 考虑使用try-except捕获任务中的异常,避免影响调度器运行
schedule库提供了简单而强大的定时任务调度功能,适合大多数Python应用的定时任务需求。通过合理使用上述功能,可以构建出灵活可靠的定时任务系统。
schedule Python job scheduling for humans. 项目地址: https://gitcode.com/gh_mirrors/sc/schedule
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考