python 的內建資料結構是執行緒安全的嗎

2021-08-17 15:08:39 字數 926 閱讀 9000

在python中,提供的執行緒是核心級的,python的執行緒切換主要有兩種方式 1.乙個執行緒當進行sleep,i/o操作時這是別的執行緒就有機會獲得gil,還有一種是,在py2中,當乙個執行緒無中斷的執行了1000個位元組(py3中是15毫秒)那麼他會被強制放棄gil。

既然執行緒切換是不可控的,那麼如果要實現執行緒安全,就得保證操作是原子性的。什麼是原子操作呢,就是不會因為執行緒併發或者程序併發而中斷操作,要麼全執行,要麼全不執行,執行過程中不會被終端。

那麼對於python的內建資料結構(list,dict, set)等 他們的操作是不是原子性的呢

在官方文件中有這麼一段解釋:

理論上講,要準確地判斷是否為原子操作,需要對pvm位元組碼有準確的理解。而在實際中,對built-

in的資料型別(ints,lists, dicts,etc)的共享變數進行操作,看起來是原子的。而實際上也是這樣的。 舉例來說,下面這些操作都是原子的。(l, l1, l2都是列表, d, d1, d2是字典,x, y是物件, i, j是ints。 ``

`python

l1.extend(l2)

x = l[i]

x = l.pop()

l1[i:j] = l2l.sort()

x = y

x.field = y

d[x] = y

d1.update(d2)

d.keys()

``` 下面這些不是的: ``

`pythoni = i+1

l[i] = l[j]

d[x] = d[x] + 1

``` 當對別的物件進行替換時,可能會導致別的物件的__del__方法被呼叫(當他的引用計數變成

0時)。這會造成一些問題,特別是對dict和list進行批量更新時,這一點尤為明顯。當你不確定時,請使用mutex互斥鎖。

如果使用者想實現原子操作  就加鎖

python內建資料結構 Python內建資料結構

分類 數值型int float complex bool 序列物件 list string tuple 鍵值對set集合 dict字典 數值型int python3中的int都是長整型,沒有大小限制,但受限於記憶體區域的大小 float 浮點型,由整數部分和小數部分組成。complex 複數,由實數...

python內建資料結構

數列物件 鍵值對 型別轉換 built in int 取整數部分 整除且向下取整 min 取最小值 max 取最大值 pow x,y 等價於x y math.sqrt 開平方 進製函式,返回值是字串 math.pi math.e 自如常數 count value 時間複雜度 len 不產生新列表,就...

Python內建資料結構

分類 數字處理函式 進製函式,返回字串 型別判斷 列表索引訪問 列表查詢 列表元素修改 列表增加 插入元素 列表尾部追加元素,返回none 即不產生新列表,就地修改 時間複雜度為o 1 追加元素全部輸出為乙個整體 insert index,object 在指定索引位置插入元素object,返回non...