Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 而真正的系统资源效应_Python_Python 3.x - Fatal编程技术网

Python 而真正的系统资源效应

Python 而真正的系统资源效应,python,python-3.x,Python,Python 3.x,为什么为True时:在某些情况下对CPU没有太大影响,而在其他情况下对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']:

为什么
为True时:
在某些情况下对CPU没有太大影响,而在其他情况下对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循环(它循环的频率和消耗的资源量)而不降低速度或导致开销,从而使测量值不相关吗

我是在win32上的Python 3.6.2(v3.6.2:5fd33b5,2017年7月8日,04:57:36)[MSC v.1900 64位(AMD64)]上执行此操作的。enumerate()threading不会影响当前进程的CPU,因为它的测量方式

但它仍然会持续轮询系统资源,因此即使您的进程没有显示高CPU使用率,系统仍然会受到压力。只是它没有被度量,因为它不是在流程执行上下文中完成的,而是在系统执行上下文中完成的

我建议您对您的进程应用一个简单的
时间
,在Linux上,它应该打印用户和系统时间。我确信,在第一个示例中,您将获得大量的系统时间(而在第二个示例中则没有)

您的第二个示例只是告诉python执行CPU密集型循环(因为
i+=1
和下面的测试,但是
pass
将执行相同的操作,只是它将是无限的),没有系统调用,它完全占用CPU,并且由系统正确测量


所以在第一种情况下,除非你想要一个非常高的反应性,并且你没有运行太长时间,我建议你在测试之间增加一个微小的延迟,这样系统可以有一个小的中断。

所以建议是在
循环中有一个刹车,而True:
循环,如果它实际上没有计算任何东西的话?编辑:哈,由您的编辑回答。您必须在具有高系统压力的高反应性和具有喘息空间的低反应性之间进行选择,所以是的。@Jean-François Fabre它将在Raspberry Pi zero上运行,它没有任何活动的CPU冷却,因此系统的中断可能是一个好主意:)是否有
时间。睡眠()
足以满足此目的?”
threading.enumerate()
不会影响当前进程CPU,因为它的测量方式。”但我查看了系统资源管理器中的总体CPU负载…@VaNa感谢您的接受。请参阅我的编辑(我对我的答案不是100%满意):我建议您对流程应用一个简单的
时间
,在Linux上,它应该打印用户和系统时间。我相信在第一个示例中您将获得大量的系统时间(在第二个示例中没有)