【问题标题】:while True system resources effect而真正的系统资源效果
【发布时间】:2017-11-10 13:01:01
【问题描述】:

为什么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 循环(它循环的频率和消耗的资源量)而不减慢它的速度或造成开销,从而使测量值变得无关紧要?

我在 Win32 上的 Python 3.6.2 (v3.6.2:5fd33b5, Jul 8 2017, 04:57:36) [MSC v.1900 64 bit (AMD64)] 上执行此操作

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    threading.enumerate() 不会影响 当前进程 CPU,因为它的测量方式。

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

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

    您的第二个示例只是告诉 python 执行 CPU 密集型循环(因为 i+=1 和您在下面的测试,但 pass 会做同样的事情,除非它是无限的),没有系统调用,它会占用 CPU好的,系统会正确测量。

    所以在第一种情况下,除非您想要非常高的反应性,并且您不会运行太长时间,否则我建议您在测试之间添加一个微小的延迟,以便系统可以有一点中断.

    【讨论】:

    • 所以建议是在while True: 循环中刹车,如果它实际上没有计算任何东西?编辑:哈,您的编辑回答了。
    • 您必须在高反应性和高系统压力和低反应性和工艺呼吸空间之间做出选择,所以是的。
    • @Jean-François Fabre 它将在没有任何主动 CPU 冷却的 Raspberry Pi 零上运行,因此系统中断可能是一个好主意 :) time.sleep() 是否足以达到此目的?
    • "threading.enumerate() 不会影响 当前进程 CPU,因为它的测量方式。"但我查看了系统资源管理器的整体 CPU 负载...
    • @VaNa 感谢您的接受。查看我的编辑(我对我的回答不是 100% 满意):我建议您将一个简单的 time 应用于您的进程,在 Linux 上,该进程应该打印用户和 system 时间.我确信在第一个示例中您会获得大量系统时间(而在第二个示例中则没有)
    猜你喜欢
    • 1970-01-01
    • 2011-02-07
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多