树莓派基于Flask的IoT Python应用架构:LED控制与定时任务并行实现
解决方案
你可以使用Python标准库自带的threading模块实现需求,无需引入额外服务或第三方依赖,非常适合树莓派的轻量运行场景。
实现思路
- 定义全局控制变量,用来动态切换LED闪烁的启停状态
- 将LED闪烁逻辑封装为独立函数,放到后台守护线程中运行,不会阻塞Flask Web服务的主线程
- 新增Flask路由处理Web端的启停请求,通过修改控制变量实现对闪烁逻辑的动态控制
可运行代码示例
# main.py import time import threading from flask import Flask import RPi.GPIO as GPIO # 初始化GPIO GPIO.setmode(GPIO.BOARD) GPIO.setup(8, GPIO.OUT, initial=GPIO.LOW) app = Flask(__name__) # 闪烁控制全局变量 blink_enabled = False blink_thread = None def blinking(): global blink_enabled while True: if blink_enabled: GPIO.output(8, GPIO.HIGH) time.sleep(1) GPIO.output(8, GPIO.LOW) time.sleep(1) else: # 未开启闪烁时降低CPU占用 time.sleep(0.1) # 定义Web路由 @app.route('/start') def start_blink(): global blink_enabled blink_enabled = True return "LED闪烁已开启" @app.route('/stop') def stop_blink(): global blink_enabled blink_enabled = False GPIO.output(8, GPIO.LOW) # 立即熄灭LED return "LED闪烁已关闭" @app.route('/') def index(): status = "运行中" if blink_enabled else "已停止" return f""" <h1>LED闪烁控制</h1> <p>当前状态:{status}</p> <button onclick="window.location.href='/start'">开启闪烁</button> <button onclick="window.location.href='/stop'">停止闪烁</button> """ if __name__ == '__main__': # 启动闪烁守护线程 blink_thread = threading.Thread(target=blinking, daemon=True) blink_thread.start() # 启动Flask服务,注意不要开启debug模式,避免重复启动线程 app.run(host='0.0.0.0', port=5000, debug=False) # 程序退出时清理GPIO GPIO.cleanup()
注意事项
- 运行后访问树莓派IP的5000端口即可打开控制界面,
/start和/stop接口也可以直接被其他服务调用 - 务必关闭Flask的debug模式,调试模式的进程重载机制会导致重复创建多个闪烁线程,出现异常
- 如果你需要更复杂的定时任务调度(比如多个定时任务、动态调整间隔),可以引入
APScheduler库替换原生threading实现,功能更丰富。
内容的提问来源于stack exchange,提问作者Philipp
相关产品推荐
相关产品推荐

