2013-07-25 133 views
3

我有一個函數調用,啓動10個線程。 這些線程開始之前,我有線程安全的python字典?

from collections import defaultdict 
output = defaultdict(dict) 

並且輸出爲空。

每個線程都會生成數據寫入字典。

喜歡的東西:

output['water'] = 'h20' 
output['fire'] = 'delta of oxygen' 
.... 

的線程只會增加項目,他們不遍歷任何其他項目或修改任何其他物品。 output['water']是與output['fire']不同的項目。我也可以保證沒有兩個線程會創建相同的項目。也就是說,每個線程T都有一個唯一的i。在代碼中:output [i]每個線程都是唯一的。

這個字典線程在這方面是否安全?

+0

你知道python實際上在線程上很糟糕嗎?考慮你是否想要這樣做。 – Marcin

+1

如果通過隊列發送條目,它們會自動線程安全。 – Jiminion

+0

是的,它是安全的,因爲GIL會阻止多個線程同時執行python代碼。 – Bakuriu

回答

1

是的。

如果您使用CPython和字符串作爲鍵,那麼是的。 CPython中的GIL確保一次只有一個線程執行字節碼,並且在一個字典中將鍵設置爲一個值會發生在單個操作碼STORE_SUBSCR中。如果您沒有使用CPython,或者您使用的自定義密鑰爲__hash____eq____cmp__方法,則所有投注都將關閉。如果我有一個肥皂盒,我會跳上它,並警告你依靠像這樣的實現細節來糾正錯誤。你寫更多的東西只適用於案例和使用環境,因爲否則可能會被視爲不成熟的優化。享受你的工作代碼!

>>> from dis import dis 
>>> dis(compile('output = defaultdict(dict); output["water"] = "H2O"', 'example', 'exec')) 
    1   0 LOAD_NAME    0 (defaultdict) 
       3 LOAD_NAME    1 (dict) 
       6 CALL_FUNCTION   1 (1 positional, 0 keyword pair) 
       9 STORE_NAME    2 (output) 
      12 LOAD_CONST    0 ('H2O') 
      15 LOAD_NAME    2 (output) 
      18 LOAD_CONST    1 ('water') 
      21 STORE_SUBSCR 
      22 LOAD_CONST    2 (None) 
      25 RETURN_VALUE 

這一直是discussed elsewhere