Python如何实现定时任务计划_使用sched模块实现事件调度器

小浩大大_2274

小浩大大_2274

2026-05-03

933人浏览

原创

sched模块不适合生产环境定时任务,因其是单次阻塞式调度器,无并发、无自动重调度、时间易漂移、不支持运行中取消任务。

python如何实现定时任务计划_使用sched模块实现事件调度器

sched 模块不适合生产环境的定时任务,它只是单次、阻塞、无并发能力的事件调度器,仅适用于简单脚本或教学演示。

为什么 sched 不能当“定时任务”用

sched 的本质是「按时间戳排队 + 阻塞等待」:它把事件放进优先队列,然后调用 run() 一直阻塞直到所有事件执行完。这意味着:

  • 一旦开始 run(),主线程就被锁死,无法响应其他输入或处理新任务
  • 没有自动重调度机制——想每 5 秒执行一次,必须手动在回调里再 enter() 一次
  • 时间精度依赖于系统时钟和 Python 解释器调度,长时间运行后容易漂移
  • 不支持取消已入队但未触发的任务(cancel() 只对 event 对象有效,且必须在 run() 前调用)

如何用 sched 实现“伪循环任务”

如果只是临时调试或写个 20 行小脚本跑一小时,可以手动递归入队。关键点是:别在 run() 后追加新事件,而是在每个回调函数里重新 enter()。

import sched
import time
<p>scheduler = sched.scheduler(time.time, time.sleep)</p><p>def do_work():
print("执行中...", time.strftime("%H:%M:%S"))</p><h1>重新入队,实现每 3 秒一次</h1><pre class="brush:php;toolbar:false;">scheduler.enter(3, 1, do_work)

初始入队

scheduler.enter(3, 1, do_work) scheduler.run() # ⚠️ 此处阻塞,后续代码不会执行

注意:do_work 必须在 scheduler.run() 调用前定义;参数优先级(第二个参数)影响同时间戳事件的执行顺序,非必需可统一设为 1。

python-code-analyz
python-code-analyz

专业Python代码分析与优化,支持语法检查、安全扫描、性能评估、复杂度分析及重构后优化代码生成。

下载

遇到 RuntimeError: can't re-enter same scheduler 怎么办

这是最常踩的坑:在 run() 执行期间,又调用了另一个 scheduler.run()(比如误在回调里嵌套调用)。sched 不支持嵌套调度。

  • 确认没在回调函数里调用 scheduler.run()
  • 不要用多线程共用同一个 scheduler 实例——每个线程应创建独立实例
  • 若需中断调度,用 threading.Event 配合 queue 或改用 asyncio 更稳妥

真正该用什么替代 sched

真实场景下,直接跳过 sched:

  • 轻量后台任务 → 用 APScheduler(支持 BackgroundScheduler,不阻塞主线程)
  • Linux 服务 → 写 shell 脚本 + cron,Python 脚本只做纯逻辑
  • Web 应用内嵌调度 → celery + redis/rabbitmq,或 Flask-SQLAlchemy 定时轮询
  • 异步环境 → asyncio.create_task() 配合 asyncio.sleep() 循环

除非你明确需要「完全同步、无外部依赖、只跑一次或几次」的调度逻辑,否则 sched 的限制远大于便利性。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1671

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4124

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1669

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

23917

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2927

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2967

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1143

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2283

5

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程