2010-02-10 46 views
6

在開發部署在Apache mod_wsgi上的Django應用程序時,我發現在多線程(Python線程; mod_wsgi進程= 1線程= 8)的情況下,Python不會使用所有可用的處理器。使用多處理方法(mod_wsgi processes = 8 threads = 1)一切正常,我可以加載我的機器。Python會使用線程模式下的所有處理器嗎?

所以這個問題:這個Python行爲是否正常?我對此表示懷疑,因爲使用1個線程的進程是默認的mod_wsgi方法。

該系統是:

2xIntel至強5XXX系列(8芯(16超線程))在FreeBSD 7.2 AMD64和Python 2.6.4


感謝所有答案。 我們都發現,這種行爲是正常的,因爲GIL。這裏有一個很好的解釋: http://jessenoller.com/2009/02/01/python-threads-and-the-global-interpreter-lock/ 或stackoverflow GIL討論:。

+1

這個問題爲什麼有三個upvotes?一個簡單的谷歌搜索就足夠了。 – aaronasterling 2010-09-11 02:49:03

+0

@aaronasterling:我們希望通過簡單的問題和簡單的答案,讓大量的知識庫成爲一個大型的數據庫。如果您的STFG – HardQuestions 2010-09-11 08:26:57

回答

10

Python會使用線程模式下的所有處理器嗎?編號

Python不會使用所有可用的處理器;這是Python的行爲正常嗎?是的,這是正常的,因爲GIL。

有關討論,請參見http://mail.python.org/pipermail/python-3000/2007-May/007414.html

您可能會發現,如果存在某些阻塞,則每個核心/進程有幾個(或4個)線程仍然可以提高性能,例如等待來自數據庫的響應會導致該進程阻止其他連接。

+0

最後一項建議無法通過非阻塞單線程方法提高性能 – nosklo 2010-02-10 12:53:49

1

我不知道它是否仍然如此,但Python解釋器中存在全局鎖定,即使在使用多線程時也可以防止單個解釋器使用所有處理器資源。全局鎖定與I/O有關。

看來你正在看這個鎖的結果,所以,我個人認爲我會用一個線程使用多個進程。

4
  1. python會在線程模式下使用所有處理器嗎?

  2. 這是正常的嗎?是的,這是正常的。 Python不會盡力找到你所有的內核。

  3. 「1個線程數少的進程是默認的mod_wsgi方法」。但這並不是最理想的,甚至是不可取的。這只是一個默認設置。不要讀任何東西。

如果要使用所有計算機的資源,請使操作系統處理它。使用過程。

多處理和多線程之間的區別很難衡量。使用進程或線程幾乎不重要。使用流程通常更簡單,因爲對此的操作支持很少。

底線

使用多個進程,允許OS(和Apache),以使盡可能系統的儘可能多的使用。

線程爲他們所屬的進程共享一組有限的I/O資源,並且網頁服務是I/O綁定的。進程具有獨立的I/O資源,並且更容易將處理器最大限度地利用。

+0

另請參見:http://docs.python.org/library/multiprocessing.html – exhuma 2010-02-10 11:28:35

1

是的。 Python並非真正的多線程。相反,有一個全局鎖,每個線程依次執行一些操作。這使得用Python編寫MT應用程序變得更加簡單,因爲不會有任何過時的緩存問題等。

所以一個Python進程只能佔用一個CPU。要充分利用多核系統,您必須運行多個Python進程。

3

還有希望。 GIL只是從python.org下載的C Python實現的實現工件。 Jython和IronPython是Python的另外兩個實現,它們沒有GIL,所以你可能有更好的線程結果。

+1

確實如此,但OP不能在mod_wsgi中使用Jython或IronPython。 – 2013-10-07 17:12:45

相關問題