2008-08-29 26 views
22

一位可靠的編碼員朋友告訴我,Python當前的多線程實現是嚴重的錯誤 - 足以避免完全使用。關於這個謠言可以說些什麼?Python線程buggy?

+2

David Beazly關於Python中的GIL的新演示文稿:http://blip.tv/file/2232410 – guns 2009-06-13 05:10:59

回答

48

Python線程很適合併發I/O編程。一旦阻塞等待來自文件,網絡等的輸入,線程就會從CPU中被換出。這允許其他Python線程使用CPU而其他人等待。例如,這將允許您編寫多線程的Web服務器或Web爬蟲程序。

但是,Python線程在進入解釋器內核時被GIL序列化。這意味着如果兩個線程正在處理數字,則只有一個線程可以在任何給定時刻運行。這也意味着你不能利用多核或多處理器體系結構。

有像使用基於C的線程庫一樣同時運行多個Python解釋器的解決方案。這不是因爲心臟不好,好處可能不值得麻煩。讓我們希望在未來的版本中使用全部Python解決方案。

+10

現在的解決方案是使用多處理模塊。 – nosklo 2008-12-15 16:20:23

-2

我已經在幾個應用程序中使用過它,並且從來沒有聽說過線程是100%可靠的任何東西,只要你知道它的限制。你不能同時產生1000個線程,並希望你的程序能夠在Windows上正常運行,但是你可以很容易地編寫一個工作池並給它提供1000個操作,並且保持一切都很好並且在控制之下。

3

據我所知沒有真正的錯誤,但線程在cPython中的性能非常差(與大多數其他線程實現相比,但通常足夠好,如果所有大部分線程都是阻塞),由於(全局解釋器鎖定),所以它實際上是特定於實現的,而不是語言特定的。例如,Jython由於使用Java線程模型而不會受此影響。

請參閱this瞭解爲什麼從cPython實現中刪除GIL並不切實可行,而對於一些實際的詳細說明和解決方法,請參閱this

"Python GIL"做一個快速谷歌瞭解更多信息。

+0

我不知道我是否會說python的線程效率低下。只是你不能利用多核機器。 – 2009-06-13 04:38:18

+1

我會,並且這個演講同意我的觀點,並提供了很多例子:http://blip.tv/file/2232410在大多數情況下,它並不重要。不過,看看這個演講吧,太棒了! – 2009-06-14 03:02:44

8

GIL(全局解釋器鎖)可能是一個問題,但API非常好。試用優秀的processing模塊,它爲單獨的進程實現了線程API。我現在正在使用它(儘管在OS X上,尚未在Windows上做一些測試),並且給我留下了深刻的印象。 Queue類在管理複雜性方面確實節省了我的培根!

編輯:它看起來處理模塊包含在版本2.6(import multiprocessing)以上的標準庫中。喜悅!

14

Python的標準實現(通常稱爲CPython,因爲它是用C語言編寫的)使用操作系統線程,但由於存在Global Interpreter Lock,因此一次只允許一個線程運行Python代碼。但是在這些限制之內,線程庫是強大的並且被廣泛使用。

如果您希望能夠使用多個CPU核心,那麼有幾個選項。正如其他人所說的,一個是同時使用多個python解釋器。另一種選擇是使用不使用GIL的Python的不同實現。兩個主要選項是JythonIronPython

Jython是用Java編寫的,現在已經相當成熟,雖然有些不兼容仍然存在。例如,網絡框架Django does not run perfectly yet,但一直在靠近。 Jython是great for thread safety,出來better in benchmarks,並有一個cheeky message for those wanting the GIL

IronPython使用.NET框架並用C#編寫。兼容性正在達到Django can run on IronPython(至少作爲演示)並且有guides to using threads in IronPython的階段。

1

如果您想在python中編寫代碼並獲得很好的線程支持,您可能需要查看IronPython或Jython。由於IronPython和Jython中的python代碼分別運行在.NET CLR和Java VM上,因此它們享受了這些庫中內置的強大的線程支持。除此之外,IronPython沒有GIL,這是一個阻止CPython線程充分利用多核架構的問題。