Python 中实现定时任务有多种方式,从简单的单线程定时器到复杂的分布式任务调度系统。以下是对 Python 定时任务的详细介绍,涵盖不同场景下的实现方法、优缺点和适用范围。
time.sleep()
time.sleep()
是最简单的定时方式,通过让程序暂停一段时间来实现定时效果。
import time
while True:
print("执行任务...")
time.sleep(5) # 每隔5秒执行一次
threading.Timer
threading.Timer
是 Python 标准库中的一个类,用于在指定的时间后执行某个函数。
import threading
def task():
print("执行任务...")
# 创建一个定时器,5秒后执行task函数
timer = threading.Timer(5, task)
timer.start()
schedule
库schedule
是一个轻量级的第三方库,支持灵活的任务调度规则。
pip install schedule
import schedule
import time
def job():
print("执行任务...")
# 每隔10秒执行一次
schedule.every(10).seconds.do(job)
# 每天10:30执行一次
schedule.every().day.at("10:30").do(job)
while True:
schedule.run_pending() # 检查是否有任务需要执行
time.sleep(1) # 避免CPU占用过高
APScheduler
库APScheduler
是一个功能强大的任务调度库,支持复杂的调度规则和持久化。
pip install apscheduler
from apscheduler.schedulers.blocking import BlockingScheduler
def job():
print("执行任务...")
# 创建调度器
scheduler = BlockingScheduler()
# 添加任务:每隔5秒执行一次
scheduler.add_job(job, 'interval', seconds=5)
# 添加任务:每天10:30执行一次
scheduler.add_job(job, 'cron', hour=10, minute=30)
# 启动调度器
scheduler.start()
interval
:按固定时间间隔执行任务。cron
:类似 Linux 的 cron
表达式,支持复杂的时间规则。date
:在特定日期和时间执行一次任务。ThreadPoolExecutor
:多线程执行任务。ProcessPoolExecutor
:多进程执行任务。Celery 是一个分布式任务队列框架,广泛应用于大规模分布式系统中。
pip install celery
from celery import Celery
from datetime import timedelta
app = Celery('tasks', broker='redis://localhost:6379/0')
@app.task
def job():
print("执行任务...")
# 配置定时任务
app.conf.beat_schedule = {
'run-every-10-seconds': {
'task': 'tasks.job',
'schedule': timedelta(seconds=10),
},
}
if __name__ == '__main__':
app.start()
Airflow 是一个开源的工作流管理平台,专为复杂任务调度设计。
pip install apache-airflow
from airflow import DAG
from airflow.operators.python_operator import PythonOperator
from datetime import datetime, timedelta
def job():
print("执行任务...")
default_args = {
'owner': 'airflow',
'start_date': datetime(2023, 1, 1),
'retries': 1,
'retry_delay': timedelta(minutes=5),
}
dag = DAG(
'example_dag',
default_args=default_args,
schedule_interval=timedelta(seconds=10),
)
task = PythonOperator(
task_id='example_task',
python_callable=job,
dag=dag,
)
if __name__ == "__main__":
dag.cli()
Cron 是 Linux 系统自带的定时任务工具,可以通过命令行配置。
编辑 crontab
文件:
crontab -e
添加以下内容:
*/5 * * * * /usr/bin/python3 /path/to/script.py
*/5
:每5分钟执行一次。/usr/bin/python3
:指定 Python 解释器路径。/path/to/script.py
:脚本路径。工具 | 特点 | 优点 | 缺点 | 适用场景 |
---|---|---|---|---|
time.sleep |
最简单的定时方式 | 无需依赖,简单易用 | 阻塞主线程,功能有限 | 简单的循环任务 |
threading.Timer |
基于线程的定时器 | 非阻塞,适合一次性任务 | 不支持周期性任务 | 一次性延迟任务 |
schedule |
轻量级第三方库 | 易于使用,支持多种调度规则 | 单线程运行,不支持分布式 | 轻量级周期性任务 |
APScheduler |
功能强大的任务调度库 | 支持复杂调度规则和持久化 | 学习成本较高 | 需要复杂调度规则的任务 |
Celery |
分布式任务队列框架 | 支持异步任务和分布式调度 | 配置复杂 | 高并发、分布式系统的任务调度 |
Airflow |
开源工作流管理平台 | 强大的工作流管理能力,可视化界面 | 启动成本高,学习曲线陡峭 | 复杂的 ETL 流程 |
Cron |
系统级定时任务工具 | 稳定可靠,不依赖 Python 库 | 配置不够直观 | 系统级别的简单定时任务 |
schedule
或 APScheduler
。Celery
。Airflow
。Cron
。