极其简单的Python程序占用100%的CPU

时间:2019-03-22 19:06:44

标签: python python-3.x opencv cv2

我有这个程序可以检查当前Python进程正在使用的CPU数量。

import os
import psutil

p = psutil.Process(os.getpid())

counter = 0
while True:
    if counter % 1000 == 0:
        print(p.cpu_percent())
    counter += 1

输出为:

98.79987719751766
98.79981257674615
98.79975442677997
98.80031017770553
98.80022615662917
98.80020675841527
98.80027781367056
98.80038116157328
98.80055555555509
98.80054906013777
98.8006523704943
98.80072337402265
98.80081374321833
98.80092993219198
98.80030995738038
98.79962549234794
98.79963842975158
98.79916715088079
98.79930277598402
98.7993480085206
98.79921895171654
98.799154456851

从输出中可以看出,该程序占用了我100%的CPU,我很难理解为什么。我注意到放置time.sleep(0.25)会导致CPU使用率降至零。

在我的实际应用程序中,我有一个类似的while循环,并且由于它正在从OpenCV读取视频并且需要保持实时,因此无法在while循环中睡眠。

import cv2

cap = cv2.VideoCapture("video.mp4")
while True:
    success, frame = cap.retrieve()

该程序使用的CPU数量与我编写的第一个程序相同,但这个程序可以解码视频!

如果有人可以解释更多,那就太好了。

3 个答案:

答案 0 :(得分:1)

我希望你做得很好!

当您这样做:

<script>
import PageBanner from '~/components/PageBanner';

export default {
  head: {
    title: 'Site Title: Blog',
    meta: [
      { hid: 'description', name: 'description', content: 'Site description' }
    ]
  },
  components: {
    PageBanner
  },
  data () {
    return {
      blogs: [],
      isLoading: true
    }
  },
  created () {
    this.axios.get("/articles/blogs.json").then((response) => {
      this.blogs = response.data
      this.isLoading = false
    })
  }
}
</script>

您实际上要求计算机不断进行处理。

它将尽可能快地增加while True: if counter % 1000 == 0: print(p.cpu_percent()) counter += 1 ,并且每次counter取1000的模时将显示cpu_percent

这意味着您的程序将不断向CPU提供有关递增该计数器的指令。

使用睡眠时,您基本上是对OS(操作系统)说,您的代码在睡眠时间之前不应执行任何新操作。这样,您的代码将不会向CPU注入指令。

睡眠将执行暂停给定的秒数。

目前,使用睡眠比使用计数器要好。

counter

我希望它会有所帮助。

祝你有美好的一天,

G

答案 1 :(得分:1)

您的原始循环正在尽速执行某事。任何只进行CPU限制工作,不涉及大量阻塞操作的程序,都会很高兴地消耗整个CPU,如果CPU速度更快,它所做的一切都会更快。

您的特定内容通常只是增加一个值并将其一遍又一地除以1000,这虽然效率低下,但是却使其效率更高,例如通过将循环更改为:

import os
import psutil

p = psutil.Process(os.getpid())

while True:
    for i in range(1000): pass
    print(p.cpu_percent())

删除所有除法工作并进行更有效的累加(range在C层进行工作),仅意味着您可以更快地完成1000个循环,而print cpu_percent频率更高(可能会稍微降低CPU使用率,但这仅仅是因为您可能print已足够,以至于输出缓冲区的填充速度快于其耗尽以进行显示的速度,并且您的程序可能有时会阻塞I / O。

要点是,如果您告诉计算机尽可能快地做某件事,它就会做到。所以不要这样使用sleep;即使很小的(time.sleep(0.001))也会有很大的不同。

对于您的视频捕获场景,这似乎首先就是您想要的。如果视频源产生的输出足以占用您的整个CPU,那就这样吧;如果不是这样,并且您的代码在运行时会阻塞,那很好,但是您不想为了降低CPU使用率而减慢处理速度(如果这意味着落后/丢帧)。

答案 2 :(得分:1)

如果您不希望它一直都在使用100%CPU,那么您可能想要将time.sleep(numberOfSeconds)添加到循环中,如果它只是一遍又一遍地检查特定条件。 我认为这可以解决您的问题