在 今天code一個python的多線程代碼,因為需要多個線程共用同一個dict,遇到一個困惑,就是dict是否是安全執行緒的,去華莽裡面查了下,發現有大牛在討論,因此記錄下,具體還需要我去進一步驗證下:
twisted的代碼中,是把dict和list當做安全執行緒來使用的,但是dict和list在jython中不是線程案全的,所以twisted特別針對jython環境做了安全執行緒處理。
上次對於這個問題,特別向Robert Chen 請教過,以下引用Robert Chen回複郵件中的部分內容:
我不知道你的"安全執行緒"的具體定義是什麼。 我分兩種情況說一下吧。
1、list的任何操作的行為應該都是確定的,比如下面的代碼 lst = [] lst[0] = 1
Python虛擬機器執行的對應的位元組碼序列為:
LOAD_CONST 1 (1)LOAD_FAST 0 (lst)LOAD_CONST 2 (0)STORE_SUBSCR
發生存資料的操作在STORE_SUBSCR位元組碼,這裡需要明確的是Python虛擬機器的線程調度,或者說中斷機制,是以位元組碼為粒度的,就是說,一個位元組碼操作可以認為是原子操作,所以STORE_SUBSCR即使在多線程的環境下也不會被中斷,它能順利地完成,所以,list的任何操作的行為都是確定的
2、list的操作序列的行為可能是不確定的,比如下面的代碼:
lst = []thread 1:lst[0] = 1thread 2:lst[0] = 2print lst[0]
thread 2中的print lst[0]的行為可能就是不確定的了。有兩種可能性:
1、thread 1先執行了"lst[0] = 1",然後被中斷,Python虛擬機器切換到thread 2,執行"lst[0] = 2,print lst[0]"兩條語句,那麼列印輸出的結果自然是2
2、thread 2先執行了"lst[0] = 2",然後被中斷,Python虛擬機器切換到thread 1,執行了"list[0] = 1",然後中斷再次發生,Python虛擬機器切換到thread 1,執行print lst[0],這時的輸出結果就應該是1,從thread 2的角度來看,這個結果就詭異了