爲什麼您可以在不需要GIL的情況下運行Jython和IronPython,但是Python(CPython)需要GIL?Python需要一個GIL。但Jython和IronPython沒有。爲什麼?
4
A
回答
2
我的猜測是,因爲CPython構建的C庫不是線程安全的。 Jython和IronPython分別針對Java和.Net構建。
8
解釋器的部分內容不是線程安全的,但主要是因爲通過大量鎖定使用它們全部線程安全會使單線程極其緩慢(source)。這似乎與使用引用計數的CPython垃圾回收器相關(JVM和CLR不會,因此不需要每次鎖定/釋放引用計數)。但即使有人想到可接受的解決方案並實施它,第三方庫仍然會有同樣的問題。
需要注意的是C語言編寫的擴展實際上可以擺脫GIL的:http://docs.python.org/c-api/init.html#thread-state-and-the-global-interpreter-lock
相關問題
- 1. IronPython和Jython與CPython有相同的GIL問題嗎?
- 2. Python vs Jython vs IronPython vs wxPython有什麼區別?
- 3. 爲什麼HttpContext.Current需要一個類中使用,但沒有一個方法
- 4. 在Ironpython中使用ipython需要什麼?
- 5. 爲什麼bcrypt需要C++和Python?
- 6. 爲什麼`fgets()`需要一個* str,但是`getline()`需要一個** str參數?
- 7. 有什麼區別,爲什麼兩個需要在NSDate:timeIntervalSince1970和timeIntervalSinceReferenceDate?
- 8. 爲什麼我們需要IEDriver和ChromeDriver,但沒有Firefox驅動程序?
- 9. datetime.date:TypeError:需要一個整數。爲什麼?
- 10. 爲什麼try塊需要一個catch
- 11. 爲什麼Fortran POINTER需要一個TARGET?
- 12. 爲什麼需要一個會話bean?
- 13. 爲什麼你需要一個Hyper-V?
- 14. 爲什麼這裏需要一個鎖?
- 15. 什麼是可能的原因需要一個文件,但它並沒有跑
- 16. 注入gridView需要VerifyRenderingInServerForm。但爲什麼?
- 17. 需要Oracle sqlldr TRAILING NULLCOLS,但爲什麼?
- 18. 爲什麼實體有時需要一個「url」參數,有時不需要?
- 19. 爲什麼C程序需要反編譯器,但python程序不需要?
- 20. 爲什麼Python中的namedtuple需要一個名字?
- 21. 爲什麼我需要一個需要實例的方法?
- 22. Python - 機械化:爲什麼需要CookieJar?
- 23. 爲什麼Python的__import__需要fromlist?
- 24. Python:需要整數。哪裏?爲什麼?
- 25. 爲什麼Python需要「self」參數?
- 26. 爲什麼某些組件需要「需要UIExplorerBlock」和「需要UIExplorerPage」?
- 27. Ruby需要'文件'不起作用,但需要'./file'。爲什麼?
- 28. 爲什麼沒有android應用程序需要主要方法
- 29. 爲什麼需要
- 30. 爲什麼需要「{} \」?
見http://stackoverflow.com/questions/991904/why-is-there-no-gil-in-the- java-virtual-machine-why-does-python-need-one-so-bad/991917#991917。 – 2010-08-07 05:05:35
@Alex Martelli,那篇文章確實提出了同樣的問題,但沒有答案解釋爲什麼cpython需要一個GIL。 – JamesD 2010-08-07 05:12:33