關於數據結構是否線程安全,這是老生長談的問題,大併發下,若是沒有用好,直接會致使嚴重問題。python
該文章後續仍在不斷的更新修改中, 請移步到原文地址http://dmwan.cc安全
好比,網上就有兩種聲音,有人說python 的 list, set, dict 的數據結構是線程安全的,有人說,這些數據結構不是線程安全的,到底這些數據結構是否線程安全?答案是確定的,其實能夠從字節碼的角度看。bash
使用dis 模塊,能直接看到python 翻譯的字節碼。 數據結構
from dis import dis dis(compile('del d[k]', 'example', 'exec')) d = {"a": 123, "b": 999} def pop(): global d del d["a"] dis(pop)
輸出是:併發
3 0 LOAD_GLOBAL 0 (d) 3 LOAD_CONST 1 ('a') 6 DELETE_SUBSCR 7 LOAD_CONST 0 (None) 10 RETURN_VALUE
解釋是 ,申明全局變量d, 倒入常量 'a', 刪除,返回。比較好理解,注意這裏的刪除是一條字節碼指令,是否線程安全的關鍵是什麼,就是操做的指令條數,若是操做是兩條,就不行,就可能內核切換,致使數據異常。線程
好比,python 的自增就不是線程安全的,翻譯
0 LOAD_GLOBAL 0 (a) 3 LOAD_CONST 1 (1) 6 INPLACE_ADD 7 STORE_GLOBAL 0 (a) 10 LOAD_CONST 0 (None) 13 RETURN_VALUE
python 的自增就是兩個操做,先add 再store ,明顯一旦發生上下文切換,就會致使store 的數據異常。這種操做和讀寫全局變量不線程安全的緣由是同樣的。code
主要提供了個思路,從底層看,到底這個程序某個步驟能不能原子的執行。因此,那些數據結構是否線程安全,都不重要,須要肯定的時候,dis 下就能直觀看出來了。get