本页目录

  • 在紧循环中使用 tryGet() 导致高 CPU 使用率
  • 问题
  • 修复方法

我的应用运行缓慢

在紧循环中使用 tryGet() 导致高 CPU 使用率

问题

如果你运行:
Python
1while True:
2    queue.tryGet()
tryGet() 是非阻塞的——无论帧是否就绪,它都会立即返回。 在紧循环中,这意味着你的程序尽可能快地旋转,占满一个 CPU 核心,并让其他线程或进程处于饥饿状态。

修复方法

a) 添加一个小延迟让 CPU 在调用之间喘息:
Python
1#!/usr/bin/env python3
2import depthai as dai
3import time
4with dai.Pipeline() as pipeline:
5    cam = pipeline.create(dai.node.Camera).build(
6        dai.CameraBoardSocket.CAM_A, sensorFps=19.0
7    )
8    rawQueue = cam.raw.createOutputQueue()
9    pipeline.start()
10    while pipeline.isRunning():
11        rawFrame = rawQueue.tryGet()
12        if rawFrame is not None:
13            print("Got a raw frame")
14        time.sleep(0.001)  # 防止 CPU 使用率达到 100%
b) 使用 get() 代替 tryGet()get() 会阻塞,直到帧就绪,因此没有忙循环:
Python
1#!/usr/bin/env python3
2import depthai as dai
3import time
4with dai.Pipeline() as pipeline:
5    cam = pipeline.create(dai.node.Camera).build(
6        dai.CameraBoardSocket.CAM_A, sensorFps=19.0
7    )
8    rawQueue = cam.raw.createOutputQueue()
9    pipeline.start()
10    while pipeline.isRunning():
11        rawFrame = rawQueue.get()
12        print("Got a raw frame")