python - while 真正的系统资源效果

标签 python python-3.x

为什么 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/

相关文章:

python - 日志记录属性 asctime 生成本地时间

python - 有效地将字典映射为新列

django - 有可能在 Django 查询集中的两个日期之间得到几个月吗?

python - Python 中 % 或 .format 运算符的 C++ 等价物是什么?

Python - 在 Flask 中将查询结果从服务器返回到客户端

python - 在 Flask 模板中打印变量

python - 内存使用量随着 Python 的 multiprocessing.pool 不断增长

python - `a == b is not None` 是如何解释的?

python - 在 Jinja2 迭代中获取倒数第二个元素

python - 从 numpy 数组获取范围/切片另一个数组的大小