Raspberry Pi Zero运行含subprocess的Python脚本CPU占用过高问题
树莓派电压监测脚本CPU占用过高问题排查
问题现象
- 脚本用于太阳能折叠项目,核心逻辑为读取INA219采集的电池电压,数值低于预设阈值时自动触发树莓派关机
- 运行时持续占用Raspberry Pi Zero唯一CPU核心60%65%资源,同设备运行的Grafana服务、监测数据写库脚本仅零星占用2%5%CPU,系统整体无其他异常
- 原脚本代码如下:
#!/usr/bin/env python import subprocess from ina219 import INA219, DeviceRangeError from time import sleep import RPi.GPIO as GPIO SHUNT_OHMS = 0.1 MAX_EXPECTED_AMPS = 3.19 ina40 = INA219(SHUNT_OHMS, MAX_EXPECTED_AMPS, address=0x40) ina40.configure(ina40.RANGE_32V) while True: v40 = ina40.voltage() print(v40) if v40 < 19: subprocess.call(["shutdown", "-h", "now"]) sleep(5)
根本原因
CPU高占用和subprocess模块没有任何关系,核心错误是循环休眠逻辑的位置写错了:
原代码里的sleep(5)写在了电压低于阈值的判断分支内部,只有触发关机逻辑时才会执行。当电池电压高于19V的正常工作状态下,while True循环会无间隔全速反复执行电压读取、打印操作,直接占满CPU资源。
另外脚本中导入的RPi.GPIO、DeviceRangeError全程未使用,属于冗余导入,不影响CPU占用但可以清理。
修复方法
把休眠逻辑移到循环的全局路径下即可,电池电压变化速度很慢,设置1~5秒的读取间隔完全满足监测需求,修改后脚本CPU占用会降到1%以下,不会影响其他服务运行。修复后参考代码:
#!/usr/bin/env python import subprocess from ina219 import INA219 from time import sleep SHUNT_OHMS = 0.1 MAX_EXPECTED_AMPS = 3.19 # 可根据实际监测需求调整读取间隔,单位为秒 READ_INTERVAL = 2 SHUTDOWN_THRESHOLD = 19 ina40 = INA219(SHUNT_OHMS, MAX_EXPECTED_AMPS, address=0x40) ina40.configure(ina40.RANGE_32V) while True: v40 = ina40.voltage() print(f"Current battery voltage: {v40:.2f}V") if v40 < SHUTDOWN_THRESHOLD: subprocess.call(["shutdown", "-h", "now"]) # 无论是否触发关机,每次读取完成后都等待固定间隔 sleep(READ_INTERVAL)
额外优化建议:如果不需要实时查看电压输出,可以注释掉
内容的提问来源于stack exchange,提问作者mlek
相关产品推荐
相关产品推荐

