2014-07-14 48 views
2

如果d是一本字典,那麼顯然如果在Python的`list(some_dictionary)`線程安全嗎?

[k for k in d] 

評估另一個線程修改d CPython的不喜歡它。怎麼樣使用

list(d) 

取而代之?這是線程安全的嗎?

+1

不要依賴CPython的實現細節。使用實際同步。 – user2357112

+1

如果*相同*線程在該條件下修改了'd',Python不會喜歡它。 –

回答

6

我完全用@ user2357112,這是一個實現細節,你不應該依賴它。但爲了回答這個問題:相關的listdict方法用C語言編寫,因此調用是單字節碼操作,並且the code不直接或間接釋放GIL,據我所知。因此在當前CPython中沒有其他Python線程可以中斷list調用並修改d

注意,這打破瞭如果任list已換上別的東西,或d不是實際誠爲本,以神寫的C.另外請注意,「是寫在C」 dictobject是不是充分條件,例如許多集合操作調用比較/散列方法,從而執行任意Python代碼,從而允許釋放GIL。

+1

值得一提的是'dict'迭代器不釋放GIL。在迭代器用Python編寫的對象上調用'list',或者其迭代器可能調用Python代碼的對象可以被GIL版本中斷。 – user2357112

+0

@ user2357112好點,補充說明以及其他警告和澄清。 – delnan

+0

感謝你們倆。我當然同意明確鎖定會更好,尤其是因爲依賴於'd'的類型。 –