繁体   English   中英

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

[英]Extremely simple Python program taking up 100% of CPU

我有这个程序可以检查当前 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 循环并且不能在 while 循环中休眠,因为它正在从 OpenCV 读取视频并且需要保持实时。

import cv2

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

这个程序占用的 CPU 和我写的第一个程序一样多,但这个程序解码视频!

如果有人能解释得更多一点那就太棒了。

我希望你做得很好!

当你这样做时:

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

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

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

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

当您使用睡眠时,您基本上是对 OS(操作系统)说您的代码不应该在睡眠时间之前执行任何新的内容。 您的代码将不会用指令淹没 CPU。

Sleep 暂停执行给定的秒数。

目前最好使用睡眠而不是柜台。

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

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

我希望它有帮助。

祝你有个愉快的一天,

G

您的原始循环正在尽可能快地执行某些操作。 任何执行纯 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 使用率而减慢处理速度。

如果您不希望它一直使用 100% CPU,如果它只是一遍又一遍地检查特定条件,您可能希望将time.sleep(numberOfSeconds)添加到您的循环中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM