You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

额外优化建议:如果不需要实时查看电压输出,可以注释掉print语句进一步降低资源占用;如果需要脚本长期后台运行,建议配置systemd服务托管,设置开机自启、异常自动重启。

内容的提问来源于stack exchange,提问作者mlek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 16:45:38