[英]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.