非常简单的Python程序占用了100%的CPU

问题描述 投票:-2回答:3

我有这个程序来检查当前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数量与我写的第一个程序相同,但这个程序解码视频!

如果有人可以解释一点那就太棒了。

python python-3.x opencv cv2
3个回答
1
投票

我希望你做得很好!

当你这样做时:

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

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

它将尽可能快地增加counter,并且每次cpu_percent模数为1000时都会显示counter

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

当你使用sleep时,你基本上会告诉OS(操作系统)你的代码在睡眠时间之前不应该执行任何新的操作。然后,您的代码将不会使CPU充满指令。

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

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

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

counter = 0
while True:
    time.sleep(1)
    print(p.cpu_percent())

我希望它有所帮助。

祝你有个愉快的一天,

G


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使用率,但只是因为你可能是printing足够的输出缓冲区填充速度快于它可以用于显示,并且你的程序可能偶尔会阻塞I / O)。

重点是,如果你告诉计算机尽可能快地做一些事情,它会。所以不要。使用sleep;即使是一个小的(time.sleep(0.001))也会产生巨大的变化。

对于您的视频捕获场景,看起来这就是您想要的第一个。如果视频源产生足够的输出以占用整个CPU,那就这样吧;如果不是,并且你的代码在它开始时会阻塞,那就太好了,但是你不想为了降低CPU使用率而减慢处理速度,如果它意味着落后/丢帧。


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.