我有以下Python代碼:當主線程運行一個無限循環時,爲什麼在一個不同的線程中導入一個模塊需要很長時間?
import threading
from datetime import datetime
import time
def f():
print('---- {:%H:%M:%S}'.format(datetime.now()))
import http.server
print('---- {:%H:%M:%S}'.format(datetime.now()))
threading.Thread(target=f).start()
while True:
pass
當我執行它,我看到了大量時間消耗到import http.server
。正如你從下面的輸出中可以看到的那樣,導入需要23秒。
C:\>python foo.py
---- 10:12:03
---- 10:12:26
但是,如果我把一個小睡在無限循環while
,進口發生得更快。
import threading
from datetime import datetime
import time
def f():
print('---- {:%H:%M:%S}'.format(datetime.now()))
import http.server
print('---- {:%H:%M:%S}'.format(datetime.now()))
threading.Thread(target=f).start()
while True:
time.sleep(1)
輸出:
C:\>python foo.py
---- 10:15:58
---- 10:15:58
我知道join()
方法的用法,但我想確切地知道爲什麼它長時間這麼import http.server
當無限while
循環沒有處於睡眠聲明它。
假設你幾乎沒有其他任何東西在運行,原因在於'while True'循環將經常發生,速度如此之快,以至於如果你這樣看,每個線程中的每個調用都會被賦予「拉鍊「的原則,每個線程在下一個線程獲得他/她的之前獲得一個CPU週期。因此,如果您要導入一個包含大量代碼的「大」模塊,那麼在每行之間需要一段時間,而「True」則需要循環並在處理器中佔用一個週期。 (粗略地說) – Torxed
@Toxxed它只會在運行CPython解釋器的處理器核心上佔用99.9%的CPU週期。其他內核不受影響。 – ElmoVanKielmo
很明顯是的,因爲Python不是開發出來的,可以在多個核心上運行。這也是我認爲不需要解釋的東西,所以我很久以前就刪除了我的描述中的那一部分:) – Torxed