一位可靠的編碼員朋友告訴我,Python當前的多線程實現是嚴重的錯誤 - 足以避免完全使用。關於這個謠言可以說些什麼?Python線程buggy?
回答
Python線程很適合併發I/O編程。一旦阻塞等待來自文件,網絡等的輸入,線程就會從CPU中被換出。這允許其他Python線程使用CPU而其他人等待。例如,這將允許您編寫多線程的Web服務器或Web爬蟲程序。
但是,Python線程在進入解釋器內核時被GIL序列化。這意味着如果兩個線程正在處理數字,則只有一個線程可以在任何給定時刻運行。這也意味着你不能利用多核或多處理器體系結構。
有像使用基於C的線程庫一樣同時運行多個Python解釋器的解決方案。這不是因爲心臟不好,好處可能不值得麻煩。讓我們希望在未來的版本中使用全部Python解決方案。
現在的解決方案是使用多處理模塊。 – nosklo 2008-12-15 16:20:23
我已經在幾個應用程序中使用過它,並且從來沒有聽說過線程是100%可靠的任何東西,只要你知道它的限制。你不能同時產生1000個線程,並希望你的程序能夠在Windows上正常運行,但是你可以很容易地編寫一個工作池並給它提供1000個操作,並且保持一切都很好並且在控制之下。
據我所知沒有真正的錯誤,但線程在cPython中的性能非常差(與大多數其他線程實現相比,但通常足夠好,如果所有大部分線程都是阻塞),由於(全局解釋器鎖定),所以它實際上是特定於實現的,而不是語言特定的。例如,Jython由於使用Java線程模型而不會受此影響。
請參閱this瞭解爲什麼從cPython實現中刪除GIL並不切實可行,而對於一些實際的詳細說明和解決方法,請參閱this。
爲"Python GIL"做一個快速谷歌瞭解更多信息。
我不知道我是否會說python的線程效率低下。只是你不能利用多核機器。 – 2009-06-13 04:38:18
我會,並且這個演講同意我的觀點,並提供了很多例子:http://blip.tv/file/2232410在大多數情況下,它並不重要。不過,看看這個演講吧,太棒了! – 2009-06-14 03:02:44
GIL(全局解釋器鎖)可能是一個問題,但API非常好。試用優秀的processing
模塊,它爲單獨的進程實現了線程API。我現在正在使用它(儘管在OS X上,尚未在Windows上做一些測試),並且給我留下了深刻的印象。 Queue類在管理複雜性方面確實節省了我的培根!
編輯:它看起來處理模塊包含在版本2.6(import multiprocessing
)以上的標準庫中。喜悅!
Python的標準實現(通常稱爲CPython,因爲它是用C語言編寫的)使用操作系統線程,但由於存在Global Interpreter Lock,因此一次只允許一個線程運行Python代碼。但是在這些限制之內,線程庫是強大的並且被廣泛使用。
如果您希望能夠使用多個CPU核心,那麼有幾個選項。正如其他人所說的,一個是同時使用多個python解釋器。另一種選擇是使用不使用GIL的Python的不同實現。兩個主要選項是Jython和IronPython。
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的階段。
如果您想在python中編寫代碼並獲得很好的線程支持,您可能需要查看IronPython或Jython。由於IronPython和Jython中的python代碼分別運行在.NET CLR和Java VM上,因此它們享受了這些庫中內置的強大的線程支持。除此之外,IronPython沒有GIL,這是一個阻止CPython線程充分利用多核架構的問題。
- 1. Python:是否索引()buggy?
- 2. Wit.ai節點程序包buggy
- 3. Buggy Javascript PDF
- 4. MediaElementJS非常buggy
- 5. Sitecore7 LinqHelper.CreateQuery Buggy?
- 6. Buggy jQuery Navbar Popout
- 7. Buggy IF語句
- 8. Switch Statement Buggy?
- 9. Python線程/線程實現
- 10. Python線程不是線程
- 11. Buggy javascript按鈕事件處理程序
- 12. Python:殺線程
- 13. Python多線程
- 14. Python的線程
- 15. 多線程python
- 16. TCP線程python
- 17. Python Tkinter線程
- 18. Python OpenCV線程
- 19. python web線程
- 20. Python。線程
- 21. Python線程池
- 22. python單線程
- 23. Python多線程
- 24. 線程在python
- 25. python線程/ fork?
- 26. Python Pyserial - 線程
- 27. 線程在python
- 28. 保存FittedModel是buggy
- 29. iOS - MKMapView - Buggy註釋
- 30. Is List :: MoreUtils :: none buggy?
David Beazly關於Python中的GIL的新演示文稿:http://blip.tv/file/2232410 – guns 2009-06-13 05:10:59