裏面我有一些功能使用__import__
導入一個Python線程
特別是交互式加載Python模塊最近,我在一些文章偶然發現關於「進口鎖」在Python,即鎖定進口(不只是GIL)。但是這篇文章很舊,所以也許這不是真的。
這讓我想知道在線程中導入的做法。
- 是
import
/__import__
線程安全嗎? - 他們可以創造死鎖嗎?
- 它們是否會導致線程化應用程序中的性能問題?
編輯2012年9月12日
感謝偉大的答覆Soravux。 所以導入是線程安全的,我不擔心死鎖,因爲在我的代碼中使用__import__
的函數不會互相調用。
是否知道即使模塊已經被導入,鎖是否被獲取? 如果是這樣,我應該查看sys.modules以檢查在調用__import__
之前模塊是否已經被導入。
當然,這應該不會在CPython中產生很大的差異,因爲無論如何都有GIL。然而,它可能會對其他實現(如Jython或無堆棧python)產生很多不同。
編輯2012年9月19日
關於Jython的,這裏是他們在doc說什麼:
http://www.jython.org/jythonbook/en/1.0/Concurrency.html#module-import-lock
Python做,然而,定義一個模塊導入鎖,這是實現 Jython的。只要輸入任何名稱的 ,就會獲取該鎖。無論導入是否通過導入 聲明,內置的等效
__import__
或相關代碼,都是如此。這是 重要的是要注意,即使相應的模塊已經導入 ,模塊導入鎖仍然會被獲取,如果只是簡單地 。
因此,在導入之前檢查sys.modules似乎是有意義的,以避免獲取鎖。你怎麼看?
我想他們是線程安全的,因爲正如你所說,解釋器阻止進口。我有興趣瞭解它們是否會以典型的非線程循環導入以外的其他方式導致死鎖。 –