我在Intel(R)Core(TM)2 Duo CPU E7500 @ 2.93GHz下運行多線程應用程序(Python2.7.3)。我認爲這將只使用一個核心,但使用「頂級」命令我看到,python進程不斷地改變核心號。在頂部命令中啓用「SHOW THREADS」顯示在不同內核上工作的不同線程進程。Python多線程,它如何使用多個內核?
任何人都可以解釋一下嗎?正如我從理論中知道的那樣,多線程是在單核上執行的,這讓我感到困擾。
我在Intel(R)Core(TM)2 Duo CPU E7500 @ 2.93GHz下運行多線程應用程序(Python2.7.3)。我認爲這將只使用一個核心,但使用「頂級」命令我看到,python進程不斷地改變核心號。在頂部命令中啓用「SHOW THREADS」顯示在不同內核上工作的不同線程進程。Python多線程,它如何使用多個內核?
任何人都可以解釋一下嗎?正如我從理論中知道的那樣,多線程是在單核上執行的,這讓我感到困擾。
首先,多線程意味着的逆,即多個內核正在同時使用(通過線程)。當涉及到這個時,CPython確實會受到損害,不過無論何時調用C代碼(這包括標準庫的一部分,還包括像Numpy這樣的擴展模塊),可以解鎖防止併發執行Python代碼的鎖。您仍然可以擁有多個線程,但它們不會同時解釋Python(相反,它們會頻繁輪換)。你還會說「Python 進程」 - 你是混淆術語,還是這個「多線程」的Python應用程序實際上是multiprocessing? 當然多個Python進程可以同時運行。
但是,從您的措詞我懷疑另一個混亂的來源。即使是單個線程也可以在多個核心上運行......只是不能同時運行。這取決於操作系統哪個線程在哪個CPU上運行,OS調度程序不一定會將線程重新分配給它在暫停之前運行的同一個CPU(這是有益的,正如David Schwartz在評論,但不重要)。也就是說,單個線程/進程從CPU跳轉到CPU是完全正常的。
感謝您的解釋。我只使用CPython中的線程模塊。我有一個有缺陷的想法,即一個線程只能在單個核心中運行。 –
實際上,許多操作系統調度程序確實嘗試在上次運行的相同CPU上重新調度線程。他們這樣做有兩個原因:首先,有一些數據仍然存在於某個CPU緩存中。其次,爲了避免在全局調度器鎖上產生太多衝突,使用具有自己的鎖的每個內核調度器結構。因此,將一個線程從一個核心移動到另一個核心需要更多的處理(將其從一個核心的線程集合移動到另一個核心的線程集合,而在每個核心上分別具有不同的鎖定),而不是在同一核心上重新運行。 –
@DavidSchwartz非常有趣,謝謝。我會調低這個句子。 – delnan
線程旨在利用多個內核時可用。如果你只有一個核心,他們也會在一個核心上運行。 :-)
沒有什麼可關注的,你觀察到的是「按預期工作」。
「我從理論上知道多線程是在單核上執行的。」我不確定你從哪裏得到。如果那是真的,那將會失敗人們使用多線程的主要原因之一。 –