为什么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()
将消耗所有计算资源(或至少由OS给出的上限)来检查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循环进行分析(循环次数和消耗的资源量),而不会减慢速度或导致开销,从而使测量值无关紧要吗?
我在win32上的Python 3.6.2(v3.6.2:5fd33b5,2017年7月8日,04:57:36)[MSC v.1900 64 bit(AMD64)]上这样做
答案 0 :(得分:3)
threading.enumerate()
不会影响当前进程 CPU,因为它的测量方式。
但它仍然会持续轮询系统资源,因此即使您的进程没有显示高CPU使用率,系统仍然会受到压力。它只是因为它没有在流程执行上下文中完成,而是在系统执行上下文中完成。
我建议您在流程中应用一个简单的time
,在Linux上,应该打印用户& 系统时间。我确信你会在第一个例子中获得大量的系统时间(并且在第二个例子中没有)
你的第二个例子告诉python执行一个CPU密集型循环(由于i+=1
而你的测试在下面,但是pass
会做同样的事情,除非它是无限的),没有系统调用,它可以很好地占用CPU,并由系统正确测量。
所以在第一种情况下,除非你想要一个非常高的反应性,并且你没有长时间运行,我建议你在测试之间加一点延迟,这样系统可以稍微休息一下
答案 1 :(得分:-1)
看书的人回答很多愚蠢的答案,只是浪费时间在学校,而不是我看到的那么多直接逻辑或答案。
while(true)会将您的程序设置为使用Windows算法基本上分配给它的所有CPU功能来运行循环中的内容,通常是尽可能快地反复进行。这并不意味着它在您的应用程序上显示100%,即如果您运行游戏,则空循环.exe将占用您所有的OS CPU能力,游戏仍应按预期运行。它更像是一个视觉错误,类似于Windows空闲过程和其他一些过程。解决方法是添加一个Sleep(1)(至少1毫秒)或更佳的睡眠(5),以确保其他内容可以运行,并确保CPU不会不断地尽可能快地循环while(true)。通常,这会将可视队列中的CPU使用率降低到0%或1%,因为1毫秒对于更老的CPU来说是一个很大的休息时间。
许多while(trues)或通用的无穷循环都是不好的设计,并且可以大大减慢到甚至Sleep(1000)-1秒间隔检查或更高。
我很有趣地看到了这个错误,当我像学习12的C弹出对话框并给出所有“愚蠢”的答案时就学会了。
只要知道是否尝试过,除非您学会使用的脚本化较慢的语言本身已将其修复,否则Windows会声称在OS实际具有空循环时会占用大量CPU。免费的资源来花费。