簡體   English   中英

而真正的系統資源影響

[英]while True system resources effect

為什么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位(AMD64)]上這樣做

threading.enumerate()不會影響當前進程 CPU,因為它的測量方式。

但它仍然會持續輪詢系統資源,因此即使您的進程沒有顯示高CPU使用率,系統仍然會受到壓力。 它只是因為它沒有在流程執行上下文中完成,而是在系統執行上下文中完成。

我建議您在流程中應用一個簡單的time ,在Linux上,應該打印用戶和系統時間。 我相信你會在第一個例子中獲得大量的系統時間(並且在第二個例子中沒有)

你的第二個例子告訴python執行一個CPU密集型循環(因為i+=1並且你的測試在下面,但是pass會做同樣的事情,除非它是無限的),沒有系統調用,它會占用CPU並且它是由系統正確測量。

所以在第一種情況下,除非你想要一個非常高的反應性,並且你沒有運行那么長時間,我建議你在測試之間加一點延遲,這樣系統就可以稍微休息一下。

讀書的人很多愚蠢的答案,只在學校浪費時間,而不是我看到的那么多直接的邏輯或答案。

while(true)會將程序設置為使用Windows算法基本上“分配”給它的所有CPU功率來運行循環中的內容,通常盡可能快地反復執行。 這並不意味着如果它對您的應用程序說100%,那么如果您運行游戲,您的空循環.exe將占用您所有的操作系​​統CPU能力,游戲仍應按預期運行。 它更像是一個視覺錯誤,類似於Windows空閑進程和其他一些進程。 修復是添加一個Sleep(1)(至少1毫秒)或更好的睡眠(5)以確保其他東西可以運行並確保CPU不會一直盡可能快地循環你的while(true)。 這通常會在可視隊列中將CPU使用率降低到0%或1%,因為即使是較舊的CPU,1毫秒也是一個很長的休息時間。

很多時候(真實)或通用的無限循環都是糟糕的設計,並且可以大幅減慢甚至睡眠(1000) - 1秒間隔檢查或更高。

有趣的是看到這個bug我學到了什么,我就像12學習C彈出一樣,給出了所有“愚蠢”的答案。

只要知道你是否嘗試過它,除非你學會使用的腳本化的較慢的語言已經將它自己固定在某個地方,當操作系統實際上有免費的資源時,windows會聲稱使用大量的CPU進行空循環。花。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM