我有一個問題關於蟒蛇鎖和線程,我意識到鎖用於防止變量被另一個線程被覆蓋,是正常的,使用鎖來解決這個問題,因爲它則意味着你可以只能同時運行一個線程,這也意味着爲每個可能被覆蓋的變量創建獲取/釋放鎖,這對我的項目來說可能會遇到很多!蟒蛇鎖定和線程併發
如何被人這樣做?包裝中的變量線程安全的列表或創建一個基於線程的名字也許是獨一無二的變量?或者是大家亂扔他們的代碼與鎖獲取和釋放?
我有一個問題關於蟒蛇鎖和線程,我意識到鎖用於防止變量被另一個線程被覆蓋,是正常的,使用鎖來解決這個問題,因爲它則意味着你可以只能同時運行一個線程,這也意味着爲每個可能被覆蓋的變量創建獲取/釋放鎖,這對我的項目來說可能會遇到很多!蟒蛇鎖定和線程併發
如何被人這樣做?包裝中的變量線程安全的列表或創建一個基於線程的名字也許是獨一無二的變量?或者是大家亂扔他們的代碼與鎖獲取和釋放?
最好的辦法是隻不使用線程的。大多數Python實現都有一個全局解釋器鎖,它消除了首先使用線程的優勢。如果您使用線程來等待IO,那麼如果您只是使用異步IO,則可以獲得相同或更好的性能。如果您使用線程在處理器之間執行計算(數字運算),python全局鎖定會阻止它運行,因此您最好使用多個進程。
在與不具有上漲空間,線程在python相反有很多缺點和注意事項,比如你已經找到了。你仍然需要做數據共享控制,並且在你無法控制的時刻處理與接收CPU注意的線程相關的怪異。所有這些都沒有好處。
TL; DR只是不使用線程
好的謝謝,所以總結嘗試和使用多處理而不是線程,因爲它迴避了GIL的要求,是的? – Paul
@Paul如果你需要多個核心數字搗弄,那麼是的。如果您需要等待輸入/輸出,則只需在單個線程/進程中使用異步IO。 – nosklo
線程沒有好處。當您有大量狀態在任務之間共享時使用線程。在你不需要的地方使用多處理,分叉的開銷很高(例如,當你需要在進程之間共享許多狀態kb時)。這裏是由Python核心貢獻者https://www.youtube.com/watch?v=Bv25Dwe84g0 你確實是需要小心,以避免創建線程分叉後一個偉大的視頻。 我認爲數字運算通常發生在GIL之外(C庫在處理時通常會釋放GIL)。 – user48956
請點擊此link解釋多線程的各個方面一般以 Python示例
奇怪的是,這個被關閉爲重複,因爲這個問題被稱爲不參考蟒蛇的。是的,有很多因素是共同的大多數編程語言,但一些語言更加線程友好的比別人,每個都有自己的怪癖(例如Python的GIL,作爲@nosklo告訴我們)。關於python的答案是有價值的。 – LarsH
問題中沒有提到Python是特定的。此外,這個問題是廣泛而且很差的,所以關閉的原因幾乎是無關緊要的。 –