python的list和dict是否是安全執行緒的討論__python

來源:互聯網
上載者:User

在 今天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的角度來看,這個結果就詭異了

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.