为什么 while True:
在某些情况下不会对 CPU 造成太大影响,而在其他情况下却会?如何防止这种情况发生?
我写了一个简单的程序并且担心
import threading
import time
#sleeptime = 0.1
while True:
#time.sleep(sleeptime)
if not [thread.name for thread in threading.enumerate() if thread.name == 'control']:
threading.Thread(target=control, name='control').start()
会消耗所有计算资源(或者至少是操作系统给定的上限)来检查 if 语句(大多数时候它是假的,所以它应该很快循环)所以我最初把 system.sleep(sleeptime )
那里可以避免这种情况,但当我删除它时我很惊讶它对系统资源没有可衡量的影响。为什么?
这让我想到了系统检查条件的频率。
天真地:如果我做类似的事情
import time
i=0
before = time.process_time()
while True:
i += 1
if i >= 100000000: #1e8 but writing 1e8 adds ~ 30% time
break
after = time.process_time()
print(after-before)
在我的机器上,我在运行时得到 11 秒和 50% 的 CPU 负载。为什么在第二个示例中我得到 50% 的负载而在第一个示例中几乎没有负载?是因为 i += 1
吗?
是否可以分析 while 循环(它循环的频率和它消耗的资源量)而不减慢它的速度或导致开销从而使测量值无关紧要?
我在 Python 3.6.2(v3.6.2:5fd33b5,2017 年 7 月 8 日,04:57:36)[MSC v.1900 64 位 (AMD64)] 在 win32 上执行此操作
最佳答案
threading.enumerate()
不会影响当前进程 CPU,因为它的测量方式。
但它仍然会持续轮询系统资源,因此即使您的进程没有显示高 CPU 使用率,系统仍然有压力。只是它没有被测量,因为它不是在您的流程执行上下文中完成的,而是在系统执行上下文中完成的。
我建议您将一个简单的 time
应用于您的进程,在 Linux 上,它应该打印用户和系统时间。我相信您会在第一个示例中获得大量系统时间(而在第二个示例中则没有)
你的第二个例子只是告诉 python 执行一个 CPU 密集型循环(因为 i+=1
和你下面的测试,但是 pass
会做同样的事情,除了它会是无限的),如果没有系统调用,它会占用 CPU,并且会被系统正确测量。
所以在第一种情况下,除非你想要非常高的 react 性,并且你不会运行太久,否则我建议你在测试之间添加一个微小的延迟,这样系统就可以有一点休息.
关于python - while 真正的系统资源效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47223373/