0

0

Python 定时任务的多种实现方式

冷漠man

冷漠man

发布时间:2026-02-11 12:50:54

|

343人浏览过

|

来源于php中文网

原创

schedule 不适合长期运行,因其无后台线程或事件循环,需持续调用 run_pending();APScheduler 适合 I/O 密集型任务但需显式启停;aioschedule 适配异步服务但要求全异步;Linux 下 cron + systemd 最稳定,需自行处理日志、锁和环境。

python 定时任务的多种实现方式

schedule 库跑着跑着就停了?它根本不适合长期运行

不是 bug,是设计如此:schedule 本身只是个“任务调度表”,没有后台线程或事件循环支撑。调用 schedule.run_pending() 后不持续轮询,任务就永远不会执行;而手动写 while True 又容易被信号中断、无法优雅退出、阻塞主线程。

常见错误现象:main() 执行完程序直接退出,或者加了 time.sleep(1) 却发现日志不输出、CPU 占用飙高、Ctrl+C 杀不死进程。

  • 只在脚本末尾调一次 schedule.run_pending() → 任务根本不会触发
  • while True: schedule.run_pending(); time.sleep(1) → 没做异常捕获,KeyboardInterrupt 或网络超时可能让整个循环崩掉
  • 把它塞进 Flask/FastAPI 的请求处理函数里 → 每次请求都新建调度器,内存泄漏+任务重复注册

APScheduler 是生产环境的默认选择,但别乱用 BackgroundScheduler

APScheduler 确实能扛住长时间运行,但它的 BackgroundScheduler 默认使用 ThreadPoolExecutor,所有 job 都在后台线程跑 —— 这意味着:全局解释器锁(GIL)没被绕过,CPU 密集型任务依然串行;更关键的是,如果主线程因未捕获异常退出,后台线程会被强制终止,job 就悄无声息地丢了。

使用场景:I/O 密集型任务(如调 API、查数据库、发邮件)没问题;需要稳定驻留、支持持久化、可远程管理的定时任务也推荐它。

立即学习Python免费学习笔记(深入)”;

  • 必须显式调用 scheduler.start(),否则什么都不会发生
  • 别在 Jupyter 或交互式 Python 里直接 run,容易卡死 —— 它依赖主线程存活
  • 想避免意外退出?用 try/except KeyboardInterrupt 包住 scheduler.start(),并在 finally 里调 scheduler.shutdown()
  • 需要跨重启保留任务状态?换 SQLAlchemyJobStore,别用默认的内存存储

asyncio + aioschedule 适合异步服务,但和普通 time.sleep 不兼容

如果你的主程序已经是 async def main() + asyncio.run(main()) 结构,那 aioschedule 是轻量又自然的选择。但它完全基于 asyncio,所有 job 函数必须是 async def,且不能出现同步阻塞调用(比如 time.sleep(5)),否则整个 event loop 就卡住。

基于HTML5的图片裁剪插件
基于HTML5的图片裁剪插件

基于HTML5的图片裁剪插件,所见即所得的裁剪方式,可生成多张缩略图大小图片,基于HTML5 canvas 绘图实现,支持各种效果的裁剪,当然你如果需要保存图片还是需要后端服务程序裁剪图片,裁剪页面是基于Bootstrap框架实现。

下载

常见错误现象:任务注册了,但永远不执行;或者执行一次后就停住;控制台报 RuntimeWarning: coroutine 'xxx' was never awaited

  • job 函数必须用 async def 定义,哪怕里面只有一行 print()
  • 替换 time.sleep() → 改用 await asyncio.sleep(5)
  • aioschedule.run_pending() 必须放进 asyncio.create_task() 或作为 task 被 asyncio.gather() 管理,不能裸跑
  • 别混用 threading.Timerschedule —— 多个调度器抢 event loop,行为不可预测

Cron + systemd 是 Linux 服务器最稳的组合,Python 脚本得自己管日志和错误

在服务器上跑定时任务,cron 不是过时方案,而是经过几十年验证的可靠基座。它不依赖 Python 进程存活,不受 GIL 影响,还能自动重试、限制资源、精确到分钟级。但代价是:Python 脚本得自己处理异常、记录日志、避免并发冲突。

典型坑点:脚本在 cron 下跑通,手动执行却报错;或者两个实例同时跑,导致数据错乱。

  • 务必在 crontab 里指定完整路径:/usr/bin/python3 /home/user/tasks/backup.py,别用 python 或相对路径
  • 环境变量不同 —— cron 默认只有 minimal PATH,缺 PYTHONPATH 或虚拟环境路径?在 crontab 开头加 PATH=... 或脚本开头用 source venv/bin/activate
  • 加文件锁防重复:用 os.open(..., os.O_CREAT | os.O_EXCL) 尝试创建锁文件,失败就直接 exit
  • stderr 默认被 mail 给 root,加 > /var/log/mytask.log 2>&1 把输出落地,不然出错了你根本不知道

真正难的从来不是“怎么让代码每 5 分钟跑一次”,而是“它挂了有没有人知道”“上次失败的数据会不会被下次覆盖”“换服务器时配置能不能一键迁移”。这些细节,比选哪个库重要得多。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python Flask框架
Python Flask框架

本专题专注于 Python 轻量级 Web 框架 Flask 的学习与实战,内容涵盖路由与视图、模板渲染、表单处理、数据库集成、用户认证以及RESTful API 开发。通过博客系统、任务管理工具与微服务接口等项目实战,帮助学员掌握 Flask 在快速构建小型到中型 Web 应用中的核心技能。

96

2025.08.25

Python Flask Web框架与API开发
Python Flask Web框架与API开发

本专题系统介绍 Python Flask Web框架的基础与进阶应用,包括Flask路由、请求与响应、模板渲染、表单处理、安全性加固、数据库集成(SQLAlchemy)、以及使用Flask构建 RESTful API 服务。通过多个实战项目,帮助学习者掌握使用 Flask 开发高效、可扩展的 Web 应用与 API。

73

2025.12.15

Python FastAPI异步API开发_Python怎么用FastAPI构建异步API
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API

Python FastAPI 异步开发利用 async/await 关键字,通过定义异步视图函数、使用异步数据库库 (如 databases)、异步 HTTP 客户端 (如 httpx),并结合后台任务队列(如 Celery)和异步依赖项,实现高效的 I/O 密集型 API,显著提升吞吐量和响应速度,尤其适用于处理数据库查询、网络请求等耗时操作,无需阻塞主线程。

27

2025.12.22

Python 微服务架构与 FastAPI 框架
Python 微服务架构与 FastAPI 框架

本专题系统讲解 Python 微服务架构设计与 FastAPI 框架应用,涵盖 FastAPI 的快速开发、路由与依赖注入、数据模型验证、API 文档自动生成、OAuth2 与 JWT 身份验证、异步支持、部署与扩展等。通过实际案例,帮助学习者掌握 使用 FastAPI 构建高效、可扩展的微服务应用,提高服务响应速度与系统可维护性。

92

2026.02.06

python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

191

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

11

2026.02.03

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

101

2023.09.25

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

633

2023.08.10

Rust异步编程与Tokio运行时实战
Rust异步编程与Tokio运行时实战

本专题聚焦 Rust 语言的异步编程模型,深入讲解 async/await 机制与 Tokio 运行时的核心原理。内容包括异步任务调度、Future 执行模型、并发安全、网络 IO 编程以及高并发场景下的性能优化。通过实战示例,帮助开发者使用 Rust 构建高性能、低延迟的后端服务与网络应用。

1

2026.02.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 4.1万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号