python 基於字節碼分析數據結構是否線程安全

    關於數據結構是否線程安全,這是老生長談的問題,大併發下,若是沒有用好,直接會致使嚴重問題。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

相關文章
相關標籤/搜索