Python多摄像头视频处理程序持续占满CPU资源,是代码错误导致的吗?
问题原因
导致CPU占用拉满的核心原因是代码中存在多处无阻塞的忙等待循环,没有做帧率控制,所有循环会尽可能抢占CPU资源全速运行:
- 主函数
main()中的无限while True循环没有任何等待逻辑,会以CPU能达到的最高频率反复读取getFrame.frame、赋值给showFrame.frame,绝大多数执行都是无意义的空转。 getFrames.getFrames()的读取循环、showFrames.showFrame()的渲染循环同样没有设置帧率匹配逻辑,除了IO阻塞的极短时间外,其余时间都会持续占用CPU执行。- 存在冗余的资源初始化操作:
getFrames类实例化时已经在__init__方法中调用了videoInit初始化摄像头,主函数中再次调用getFrame.videoInit(videoSource)属于重复初始化,会额外占用系统资源。 - 线程间采用共享变量轮询的方式传递帧,没有用阻塞队列等机制,轮询过程会持续消耗CPU。
修复方案
- 给所有循环添加和摄像头帧率匹配的等待逻辑,比如你的摄像头是30FPS,那么可以在每次循环末尾加
time.sleep(1/30),避免循环空转。 - 改用队列实现线程间的帧传递:
getFrames读取到新帧后写入队列,主函数从队列阻塞取帧,有新帧才进行后续处理,没有新帧时线程进入休眠不占用CPU。 - 删除主函数中冗余的
getFrame.videoInit(videoSource)调用,避免重复初始化摄像头。 - 如果不需要实时打印线程数,可删除主循环内的
print调用,减少不必要的IO消耗。
内容的提问来源于stack exchange,提问作者Albert
相关产品推荐
相关产品推荐

