使用dbader/schedule库实现Python定时任务详解

使用dbader/schedule库实现Python定时任务详解

schedule Python job scheduling for humans. schedule 项目地址: 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提供了丰富的任务管理功能:

  1. 取消单个任务
job = schedule.every().day.at('22:30').do(some_task)
schedule.cancel_job(job)
  1. 任务只执行一次
def one_time_job():
    # 只执行一次的工作
    return schedule.CancelJob

schedule.every().day.at('22:30').do(one_time_job)
  1. 获取所有任务
all_jobs = schedule.get_jobs()
  1. 取消所有任务
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秒

最佳实践

  1. 在主循环中总是包含time.sleep(1),避免CPU占用过高
  2. 对于长时间运行的任务,考虑使用线程或进程避免阻塞
  3. 生产环境中建议结合日志记录任务执行情况
  4. 考虑使用try-except捕获任务中的异常,避免影响调度器运行

schedule库提供了简单而强大的定时任务调度功能,适合大多数Python应用的定时任务需求。通过合理使用上述功能,可以构建出灵活可靠的定时任务系统。

schedule Python job scheduling for humans. schedule 项目地址: https://gitcode.com/gh_mirrors/sc/schedule

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gitblog_01004

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值