Files
2026-06-15 00:55:47 -06:00

52 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 天气数据自动采集与推送系统——定时任务与自动化采集 教学设计
| **课题** | **天气数据自动采集与推送系统——定时任务与自动化采集** |
|---------|------------------------------------------|
| **课时** | 1课时(40分钟) |
| **教学目标** | **知识目标**理解定时任务的概念与应用场景掌握schedule库的基本使用方法了解程序保活与后台运行的基本原理。<br>**技能目标**能够使用schedule库创建定时任务能够将前两节课的天气采集模块整合为自动化运行程序能够实现"每隔N分钟自动采集并保存数据"的完整功能,能够添加日志记录与异常处理确保程序稳定运行。<br>**素养目标**:建立"自动化思维",理解软件系统的无人值守运行模式,培养将技术能力转化为实用工具的工程意识。 |
| **教学重难点** | **重点**schedule库的安装与基本API使用定时任务的创建、调度与触发程序保活的while循环实现日志记录的规范写法。<br>**难点**理解schedule的非阻塞调度机制与run_pending()的作用;设计合理的任务执行间隔;处理长时间运行程序的异常与资源管理。 |
| **教学资源准备** | 多媒体课件含定时任务场景案例、系统架构图前两节课完成的weather_fetcher.py和multi_thread_fetcher.py模块schedule库安装包日志配置示例代码完整项目运行演示视频。 |
## 教学过程
| 教学环节 | 教学内容 | 教师活动 | 学生活动 | 设计意图 |
|:---------|:---------|:---------|:---------|:---------|
| **1. 自动化场景导入**<br>(6分钟) | 展示生活中的自动化案例(如定时提醒、自动备份),引出"让天气采集程序自动运行"的需求,明确本课时要实现的项目最终目标。 | **场景列举**<br>列举自动化应用:闹钟、定时发送报表、服务器定时备份等,提问:"我们的天气系统如何做到每小时自动采集?"<br><br>**目标演示**<br>播放完整项目运行视频程序启动后自动每30分钟采集一次数据保存到文件并输出日志无需人工干预。 | **联系经验**<br>回忆日常使用的自动化功能,理解"定时执行"的价值;<br><br>**明确目标**<br>观看演示,建立"让程序自己跑起来"的认知,理解本课时是项目的"收官之作"。 | 通过生活化案例建立自动化认知;通过完整演示展示项目最终形态,激发学生的成就欲望和完成项目的动力。 |
| **2. 定时任务原理**<br>(7分钟) | 讲解定时任务的实现机制介绍Python的schedule库演示基本的任务调度代码说明"调度循环"的概念。 | **原理讲解**<br>说明定时任务的本质程序持续运行定期检查是否到达执行时间介绍schedule库是对时间检查逻辑的封装<br><br>**基础演示**<br>编写简单示例:<br>```python<br>import schedule<br>import time<br>def job():<br> print("任务执行!")<br>schedule.every(10).seconds.do(job)<br>while True:<br> schedule.run_pending()<br> time.sleep(1)<br>```<br>逐行讲解:定义任务函数、设置调度规则、启动循环检查。 | **聆听理解**<br>理解"持续检查+触发执行"的调度机制记录schedule的核心API<br><br>**代码跟随**<br>输入演示代码并运行观察每10秒自动执行一次的效果尝试修改间隔时间如30秒、1分钟。 | 通过原理讲解揭开定时任务的"神秘面纱";通过简单示例建立"设置规则-启动循环"的操作模型,为项目集成打基础。 |
| **3. 项目模块集成**<br>(13分钟) | 指导学生创建主程序文件,整合前两节课的采集模块,实现"定时自动采集多城市天气并保存"的完整功能,添加时间戳与日志输出。 | **架构讲解**<br>说明项目文件结构weather_fetcher.py单城市、multi_thread_fetcher.py并发、main_scheduler.py定时主程序<br><br>**集成演示**<br>演示main_scheduler.py编写过程<br>```python<br>import schedule<br>from multi_thread_fetcher import fetch_all_cities<br>def auto_fetch():<br> data = fetch_all_cities()<br> # 保存到文件,添加时间戳<br> print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] 采集完成")<br>schedule.every(30).minutes.do(auto_fetch)<br>```<br>讲解数据保存方案CSV或JSON、时间戳格式化<br><br>**运行测试**<br>启动程序,观察首次执行和后续自动触发的效果。 | **理解架构**<br>明确各模块的职责分工理解main_scheduler是"指挥中心"<br><br>**动手编码**<br>创建main_scheduler.py导入并发采集模块设置定时规则如每30分钟添加数据保存代码<br><br>**测试验证**<br>运行程序,确认定时执行正常,检查保存的数据文件格式与内容。 | 通过模块集成培养系统化编程思维;通过完整实现建立"小模块组成大系统"的认知;通过实际运行验证项目的实用性。 |
| **4. 稳定性优化**<br>(10分钟) | 讲解长时间运行程序的常见问题,指导学生添加异常处理、日志记录、资源管理等代码,确保程序稳定可靠。 | **问题分析**<br>说明长期运行可能遇到的问题网络故障、API限流、内存泄漏等强调健壮性的重要性<br><br>**优化方案**<br>演示添加try-except包裹任务函数、配置logging模块记录日志<br>```python<br>import logging<br>logging.basicConfig(filename='weather.log', level=logging.INFO)<br>def auto_fetch():<br> try:<br> # 采集逻辑<br> logging.info("采集成功")<br> except Exception as e:<br> logging.error(f"采集失败:{e}")<br>```<br>讲解日志级别INFO、ERROR、日志文件的查看方法<br><br>**最佳实践**<br>建议添加程序启动提示、优雅退出机制Ctrl+C处理。 | **认识风险**<br>理解"程序不能假设一切正常"的思想,记录异常处理的必要性;<br><br>**优化代码**<br>为auto_fetch()添加try-except配置logging输出到文件测试故意制造错误如API密钥错误观察日志记录<br><br>**完善程序**<br>添加程序启动提示信息,如"天气采集系统已启动每30分钟执行一次"。 | 通过问题分析培养风险意识;通过优化方案教学提升代码质量;通过日志实践建立生产级程序的开发习惯。 |
| **5. 项目总结与展望**<br>(4分钟) | 回顾整个项目的三个核心模块总结从HTTP请求到多线程再到自动化的完整技术链条展望后续可扩展的功能方向。 | **项目回顾**<br>梳理项目实现路径第1课时建立数据源→第2课时提升采集效率→第3课时实现自动化运行<br><br>**成果展示**<br>请学生展示运行中的程序和保存的数据文件,分享项目完成的成就感;<br><br>**扩展方向**<br>提出可选的增强功能数据可视化matplotlib、极端天气告警推送邮件/短信、Web界面展示等<br><br>**任务布置**<br>课后任务让程序在电脑上持续运行24小时观察日志并统计采集成功率。 | **总结反思**<br>回顾三次课的学习历程,理解"技术服务于需求"的思想;<br><br>**展示成果**<br>演示自己的运行程序,分享实现过程中的收获与困难;<br><br>**展望未来**<br>思考项目的实用场景和可改进方向,接收课后实验任务。 | 通过系统回顾强化知识体系;通过成果展示建立成就感与自信;通过扩展方向保持学习兴趣和探索欲望。 |
## 板书设计
```
天气数据自动采集系统 - 完整架构
┌─────────────────────────────────────┐
│ main_scheduler.py (定时调度主程序) │
│ ├── schedule.every(30).minutes │
│ ├── 异常处理 + 日志记录 │
│ └── while True: run_pending() │
├─────────────────────────────────────┤
│ multi_thread_fetcher.py (并发模块) │
│ └── ThreadPoolExecutor 并发采集 │
├─────────────────────────────────────┤
│ weather_fetcher.py (数据源模块) │
│ └── requests.get() 调用API │
└─────────────────────────────────────┘
自动保存数据文件 + 日志文件
核心代码:
schedule.every(30).minutes.do(任务函数)
while True:
schedule.run_pending()
time.sleep(1)
```
## 教学成效与反思
| | |
|:---|:---|
| **教学成效** | 结合本课时项目任务评估95%学生成功实现定时自动采集功能85%学生能够添加完整的异常处理与日志记录。通过三节课的连贯学习,学生完整经历了"单功能模块→性能优化→系统集成"的项目开发过程,对软件工程的模块化思想有了深刻体会。定时任务的实现让学生看到了"程序自己工作"的魅力,课堂兴奋度和成就感达到高峰。项目最终成果具有实用性,部分学生表示愿意持续运行并收集数据做后续分析,显示出强烈的学习内驱力。日志记录的引入提升了学生对"生产级代码"的认知。 |
| **教学反思** | 本课时成功将"定时任务与自动化"概念转化为"让天气系统自动运行"的具体目标学生的学习动机和参与度极高。三节课形成的完整项目链条设计合理每节课的模块都能无缝集成到最终系统中验证了项目式教学的有效性。schedule库的简洁API降低了定时任务的学习门槛学生普遍反馈"比想象中容易"。不足之处①在40分钟内对"程序后台运行"的操作系统层面知识如nohup、系统服务等未能涉及部分学生询问"如何让程序关闭终端后仍运行",建议作为课后拓展资料补充;②日志配置部分主要由教师演示,学生自主设计日志格式的时间不足,建议提供更灵活的日志模板让学生定制;③对"定时任务的精度限制"如schedule是软实时未做说明可能导致学生对时间准确性有过高期待。整体上项目式教学使三个看似独立的技术主题HTTP、多线程、定时任务自然融合为一个有机整体学生在完成项目的过程中建立了系统化思维和工程实践能力教学目标超预期达成。建议后续可将此项目作为综合实训案例引导学生继续扩展功能如添加Web界面、数据分析模块等。 |