久久r热视频,国产午夜精品一区二区三区视频,亚洲精品自拍偷拍,欧美日韩精品二区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

詳解Python多線程下的list

瀏覽:5日期:2022-07-18 17:09:42

list 是 Python 常用的幾個(gè)基本數(shù)據(jù)類型之一.正常情況下我們會(huì)對(duì) list 有增刪改查的操作,顯然易見不會(huì)有任何問題.那么如果我們?cè)囍诙嗑€程下操作list 會(huì)有問題嗎?

多線程下的 list

安全 or 不安全? 不安全!

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

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

如何判斷線程安全呢?

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

import threadingimport time# 隨意設(shè)置 count 的值,值越大錯(cuò)誤拋出的越快count = 1000l = []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)

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

詳解Python多線程下的list

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

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

dis

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

remove

這里我們先看一下上面 list 的 remove 操作

>>> import dis>>> def test_remove():... a = [1]... a.remove(0)... >>> dis.dis(test_remove) 2 0 LOAD_CONST1 (1) 2 BUILD_LIST1 4 STORE_FAST0 (a) 3 6 LOAD_FAST0 (a) 8 LOAD_ATTR0 (remove) 10 LOAD_CONST2 (0) 12 CALL_FUNCTION 1 14 POP_TOP 16 LOAD_CONST0 (None) 18 RETURN_VALUE

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

append

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

8 19 LOAD_GLOBAL 0 (a) 22 LOAD_ATTR2 (append) 25 LOAD_CONST2 (1) 28 CALL_FUNCTION 1 31 POP_TOP

這里顯然,append 也是有幾條指令,勢(shì)必在多線程執(zhí)行的情況下也會(huì)發(fā)生交錯(cuò),但是對(duì)于多線程下我們操作 append, 我們肯定也不會(huì)在乎這個(gè)時(shí)候 list 到順序問題了,所以我們說(shuō)它的 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的詳細(xì)內(nèi)容,更多關(guān)于Python多線程下的list的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 同江市| 分宜县| 天祝| 辽阳县| 高淳县| 西丰县| 清丰县| 灵武市| 宜兴市| 噶尔县| 白银市| 仲巴县| 理塘县| 双流县| 宜宾县| 北票市| 赫章县| 东莞市| 绍兴县| 兰州市| 鱼台县| 东乡族自治县| 麦盖提县| 遂平县| 聂拉木县| 汉源县| 绥德县| 浏阳市| 青铜峡市| 无为县| 株洲县| 海南省| 巴塘县| 郸城县| 屏山县| 三门县| 五河县| 河曲县| 沙河市| 岑巩县| 抚顺县|