一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術(shù)及教程分享平臺!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - 詳解Python多線程下的list

詳解Python多線程下的list

2020-07-04 17:27leetao Python

這篇文章主要介紹了Python多線程下的list的相關(guān)資料,文中示例代碼非常詳細,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下

listPython 常用的幾個基本數(shù)據(jù)類型之一.正常情況下我們會對 list 有增刪改查的操作,顯然易見不會有任何問題.那么如果我們試著在多線程下操作list 會有問題嗎?

多線程下的 list

安全 or 不安全? 不安全!

通常我們說的線程安全是指針對某個數(shù)據(jù)結(jié)構(gòu)的所有操作都是線程安全,在這種定義下,Python 常用的數(shù)據(jù)結(jié)構(gòu) list,dict,str 等都是線程不安全的

盡管多線程下的 list 是線程不安全的,但是在 append 的操作下是它又是線程安全的.

如何判斷線程安全呢?

對于線程安全不安全,我們可以通過極端條件下去復(fù)現(xiàn),從而得出結(jié)論。比如說判斷 list 是否線程安全

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import threading
import time
 
# 隨意設(shè)置 count 的值,值越大錯誤拋出的越快
count = 1000
l = []
 
def add():
  for i in range(count):
    l.append(i)
    time.sleep(0.0001)
 
def remove():
 
  for i in range(count):
    l.remove(i)
    time.sleep(0.0001)
 
 
t1 = threading.Thread(target=add)
t2 = threading.Thread(target=remove)
t1.start()
t2.start()
t1.join()
t2.join()
print(l)

有時候一次運行并不一定就會出錯,多次重試之后會出現(xiàn)類似下面的錯誤

詳解Python多線程下的list

很顯然這種操作方式不具有普適性,如果要是歐氣太強,說不定會一直不出現(xiàn)異常。

那么出了這種方式,有沒有比較簡單有效的方法嗎?答案是有的

dis

dis 庫是 Python 自帶的一個庫,可以用來分析字節(jié)碼。這里我們需要有這樣的認識,字節(jié)碼的每一行都是一個原子操作,多線程切換就是以原子操作為單位的,如果一個操作需要兩行字節(jié)碼就說明它是線程不安全的

remove

這里我們先看一下上面 listremove 操作

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>>> import dis
>>> def test_remove():
...   a = [1]
...   a.remove(0)
...
>>> dis.dis(test_remove)
 2      0 LOAD_CONST        1 (1)
       2 BUILD_LIST        1
       4 STORE_FAST        0 (a)
 
 3      6 LOAD_FAST        0 (a)
       8 LOAD_ATTR        0 (remove)
       10 LOAD_CONST        2 (0)
       12 CALL_FUNCTION      1
       14 POP_TOP
       16 LOAD_CONST        0 (None)
       18 RETURN_VALUE

從上面不難看出,整個 remove 操作被分成了好幾條指令,這就意味著在多線程情況下會出現(xiàn)錯亂的情況,試想一下,如果多線程下都去 remove 列表的話,并且不按照順序,很容易出現(xiàn)問題。

append

在最上面我們說到,list append 操作是線程安全的,那么究竟是為什么呢?我們同樣來用 dis 查看一下

?
1
2
3
4
5
8     19 LOAD_GLOBAL       0 (a)
      22 LOAD_ATTR        2 (append)
      25 LOAD_CONST        2 (1)
      28 CALL_FUNCTION      1
      31 POP_TOP

這里顯然,append 也是有幾條指令,勢必在多線程執(zhí)行的情況下也會發(fā)生交錯,但是對于多線程下我們操作 append, 我們肯定也不會在乎這個時候 list 到順序問題了,所以我們說它的 append 是線程安全的

參考

https://stackoverflow.com/questions/6319207/are-lists-thread-safe/19728536#19728536

https://docs.python.org/3/faq/library.html#what-kinds-of-global-value-mutation-are-thread-safe

以上就是詳解Python多線程下的list的詳細內(nèi)容,更多關(guān)于Python多線程下的list的資料請關(guān)注服務(wù)器之家其它相關(guān)文章!

原文鏈接:https://www.cnblogs.com/leetao94/p/13228360.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 免费看片黄色 | 好男人资源在线观看免费的 | 欧美一区二区三区在线观看免费 | 四虎永久在线精品波多野结衣 | 91传媒制片厂制作传媒破解版 | www.亚洲天堂 | 亚洲成年人免费网站 | 亚洲黄色高清 | 欧美3p大片在线观看完整版 | 91精品免费国产高清在线 | 日本福利片国产午夜久久 | 欧美成人影院免费观 | 欧美午夜视频一区二区三区 | 国产精品久久久久久久久久久搜索 | 国产高清自拍视频 | 91麻豆精东果冻天美传媒老狼 | 无码毛片内射白浆视频 | 香蕉免费看一区二区三区 | 歪歪动漫小说sss | 青草视频在线观看免费网站 | 无码国产成人777爽死 | 欧美在线观看一区二区三 | 欧美日韩中文字幕一区二区高清 | 四虎免费在线观看视频 | 久久中文字幕无线观看 | 性夜a爽黄爽 | 国产欧美日韩精品在线 | 古装床戏做爰无遮挡三级 | 德国高清freexxxx性 | 亚洲视频在线一区二区三区 | 青青草原国产一区二区 | 免费标准高清看机机桶机机 | 国产 日韩 欧美视频二区 | 91大神亚洲影视在线 | 亚洲国产成人精品不卡青青草原 | 荡娃艳妇有声小说 | 猫咪av | 欧美激烈精交gif动态图18p | 变形金刚第一部 | 色444| 亚洲swag精品自拍一区 |