我有这个程序可以检查当前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数量与我编写的第一个程序相同,但这个程序可以解码视频!
如果有人可以解释更多,那就太好了。
答案 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)添加到循环中,如果它只是一遍又一遍地检查特定条件。 我认为这可以解决您的问题