簡體   English   中英

線程安全的python詞典?

[英]thread safe python dictionaries?

我有一個函數調用,啟動10個線程。 在這些線程開始之前,我有

from collections import defaultdict
output = defaultdict(dict)

並且輸出為空。

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

就像是:

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

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

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

是。

如果您使用CPython和字符串作為鍵,那么是的。 CPython中的GIL確保一次只有一個線程執行字節碼,並且將一個鍵設置為dict中的值發生在單個操作碼STORE_SUBSCR 如果你不使用CPython的,或者您使用的是定制的關鍵__hash____eq__ ,或__cmp__方法,全盤皆輸。 如果我有一個肥皂盒,我會跳過它,並警告你依賴這樣的實現細節以保證正確性。 寫一些僅適用於案例以及將在其中使用的環境的東西更加pythonic,因為否則可能被視為過早的優化。 享受您的工作代碼!

>>> 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

這已在別處討論過

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM