2016-02-11 59 views
1

我在一臺服務器上運行python程序,它有python2.7.6。我已經使用python的threading模塊來創建多個線程。我已經創建了23個線程,所以我很困惑是否所有的處理器核心實際上都在使用,有沒有什麼辦法可以在我的服務器中檢查。任何建議都應該是理想的線程數量,根據我們爲了提高程序效率的處理器數量而生成的線程數量。python中應該怎麼產生線程

回答

1

David Beazly在Python中有a great talk on threading。他還就這個主題here做了精彩的介紹。

不幸的是,Python有一些叫做GIL的東西,它限制了Python一次執行一個線程。要使用所有核心,您必須使用多個進程:See Multiprocessing

有些在Python社區中並不一定會將GIL視爲挫折,您可以通過共享內存線程之外的其他方式利用多個內核。

在這裏尋找一個great blog post on utilizing multiple cores in Python.

編輯:以上 是CPython的(最常見的,也的Python的參考實現)實現。那裏有幾個"yes but"答案在那裏(主要是指多線程在不同的Python實現),但我通常會指向人answers like this one描述的GIL在CPython的和替代的利用多核6

+0

謝謝回答,但我的程序最初用於需要大約14分鐘才能完成。然而,應用線程後,它已經減少到3分鐘。所以當然,我認爲隨着時間的急劇減少,多個內核正在被利用。 – kkk

+0

@kkk - 如果您查看我發佈的鏈接,您應該熟悉Python中的多線程。當進程是IO密集型的時候,多線程可以提高性能,因爲當線程忙於等待IO資源時,線程將釋放它對GIL的鎖定。如果你的應用程序是CPU密集的;您將看到使用多個線程的性能改善很小或沒有。你甚至可以看到嚴重的性能損失! – nlloyd

0

沒有真正的答案對於這個問題,每個人都可能有不同的看法。在測試x場景以及線程的y之後,應確定應用程序的線程數以提高性能。性能取決於操作系統調度程序如何根據CPU負載或正在運行的進程數量將您的線程調度到可用的CPU核心。如果你有4個內核,那麼這並不意味着它只能執行4個線程。實際上你也可以運行23個線程。這就是我們所說的調度程序通過在進程之後調度進程給予我們的並行性幻覺,因此使我們認爲一切都在同時運行。

這是事情

如果您運行1個線程,您可能無法獲得足夠的性能。隨着線程數量不斷增加,調度程序將花費更多時間安排線程並阻礙整體應用程序的性能。

+0

呀誠然,整個過程正在相對較小的時間,但你能告訴我如何在使用線程模塊的線程得到分配給不同的處理器? – kkk

+0

我們不能。內核根據不同的算法分配它。但是一旦一個線程得到一個CPU,操作系統會嘗試將線程分配給那個始終被稱爲 –

+0

okk的地方,但是當使用python的線程模塊時線程被分配給不同的處理器。 – kkk