最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

簡(jiǎn)單探討一下python線程鎖

 更新時(shí)間:2023年04月23日 08:30:45   作者:真的不能告訴你我的名字  
本文主要介紹了簡(jiǎn)單探討一下python線程鎖,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

為什么需要線程鎖

當(dāng)我們?cè)L問(wèn)一些特殊的數(shù)據(jù)時(shí),需要保證該數(shù)據(jù)的原子性,比如: 文章的閱讀量、文章的點(diǎn)贊量等。我們必須要確保這些共享數(shù)據(jù)必須是原子性的,否則的話,多線程同時(shí)訪問(wèn)的時(shí)候,可能會(huì)出現(xiàn)異常情況,什么是原子性呢?原子性是指一個(gè)操作是不可能被中途中斷的,要不全部完成,要不沒(méi)有完成,這么說(shuō),可能不理解,下面舉個(gè)例子來(lái)說(shuō)明一下原子性的重要性:

比如我們寫一個(gè)程序,來(lái)模擬10個(gè)人點(diǎn)贊,最后輸出閱讀量的值,代碼如下:

代碼初看好像沒(méi)什么問(wèn)題,反正核心點(diǎn)就是閱讀量+1,當(dāng)運(yùn)行就,就出現(xiàn)問(wèn)題了,

上述代碼,運(yùn)行了5次,出現(xiàn)了5次不一樣的結(jié)果。這就是出現(xiàn)了競(jìng)爭(zhēng),所以我們需要加一個(gè)鎖,來(lái)確保該閱讀量函數(shù)的原子性。

線程鎖使用

python中的threading模塊,提供的鎖就只有一種,我們使用Lock定義鎖,例如:

Lock = threading.Lock()

如果需要對(duì)資源進(jìn)行上鎖的話,使用acquire方法即可,例如:

Lock.acquire()

如果需要對(duì)資源進(jìn)行解鎖的話,使用release方法即可,例如:

Lock.release()

除此之外,threading模塊還提供了RLock可重入鎖,可重入鎖的作用和普通鎖一樣,用于保護(hù)資源,以保證并發(fā)訪問(wèn)不會(huì)出現(xiàn)問(wèn)題,但是與普通鎖不同的是,可重入鎖允許同一個(gè)線程在持有鎖的情況下多次獲取該鎖而不會(huì)發(fā)生死鎖。但是在持有多少次鎖,也必須釋放多少次鎖,否則會(huì)出現(xiàn)問(wèn)題。

案例說(shuō)明線程鎖

上述我們介紹了線程鎖,這里將addReaderCount進(jìn)行加鎖和解鎖的操作,代碼如下:

上述代碼在源代碼的基礎(chǔ)上,在最開(kāi)始使用Lock定義了一個(gè)鎖,而后再函數(shù)開(kāi)始之前進(jìn)行一個(gè)加鎖acquire(),這樣的話,其他函數(shù)在執(zhí)行的時(shí)候,發(fā)現(xiàn)這個(gè)是已經(jīng)鎖住了的,所以會(huì)等待,等待解鎖后(releas())再進(jìn)行該函數(shù),而函數(shù)又會(huì)加鎖,如此往復(fù),能夠確保在同一時(shí)刻,addReaderCount函數(shù)只執(zhí)行一次。

執(zhí)行程序結(jié)果為:

可以發(fā)現(xiàn),這次的結(jié)果閱讀量的值終于符合我們的預(yù)期了。

實(shí)現(xiàn)一個(gè)讀寫鎖

python中,原生是沒(méi)有讀寫鎖的,只能借助第三方來(lái)實(shí)現(xiàn),這里我們可以實(shí)現(xiàn)一個(gè)簡(jiǎn)單的讀寫鎖。

在寫之前,我們需要先了解下讀寫鎖的作用到底是什么?讀寫鎖將資源拆分為讀和寫2種操作,讀鎖允許多個(gè)線程同時(shí)讀取共享資源,提高并發(fā)性能。但是當(dāng)需要修改共享資源的時(shí)候,只能允許一個(gè)線程修改該共享資源,并且在修改完畢前,不允許讀請(qǐng)求,以便造成數(shù)據(jù)不一致。所以操作完畢后,開(kāi)放讀請(qǐng)求。

這里為了實(shí)驗(yàn),寫了一個(gè)最簡(jiǎn)單的讀寫鎖,安全性和效率都得不到保證,若想使用讀寫鎖,可以使用第三方的讀寫鎖。

我們自己寫的讀寫鎖代碼如下:

上述代碼,我們實(shí)現(xiàn)了一個(gè)讀寫鎖類RWLock,其中有4個(gè)方法,分別為:

  • writeLock:寫鎖
  • writeUnlock:釋放寫鎖
  • readLock:讀鎖
  • readUnlock: 釋放讀鎖

由于讀鎖可以同一時(shí)刻被調(diào)用,所以我們使用的變量readCount來(lái)定義的,等需要讀鎖的是,readCount會(huì)+1,可以一直調(diào)用下去,而如果需要寫鎖的時(shí)候,這里是先將寫鎖變量Locked定義為True,若此時(shí)再次調(diào)用讀寫,會(huì)讓其等待,而在寫鎖中,會(huì)等待讀鎖讀取完畢后(readCount為0的時(shí)候),再進(jìn)行寫鎖的請(qǐng)求。寫鎖執(zhí)行完畢后,會(huì)將Locked給重置為False。

這里寫一個(gè)小的調(diào)用方法來(lái)調(diào)用一下:

上述代碼,在readswrites方法中,分表調(diào)用我們之前定義的讀鎖和寫鎖,代碼中定義了9個(gè)線程,分別是調(diào)用了6次讀,以及3次寫。

效果我們來(lái)看下:

從上述結(jié)果中,我們不難發(fā)現(xiàn),在沒(méi)有寫鎖情況下,我們使用讀鎖,可以訪問(wèn)同一資源,當(dāng)使用寫鎖后,讀鎖會(huì)暫停,當(dāng)寫鎖執(zhí)行完畢后,讀鎖才會(huì)繼續(xù)批量執(zhí)行。

總結(jié)

本篇文章簡(jiǎn)單探討了一下python線程鎖,并且舉了一個(gè)點(diǎn)贊的案例,來(lái)說(shuō)明某些資源/函數(shù)需要原子性操作的時(shí)候,為避免資源競(jìng)爭(zhēng),所以需要在使用過(guò)程中,增加一個(gè)鎖,以保證其原子性,由于python原生沒(méi)有讀寫鎖,需要依賴于第三方,所以最后我們寫了一個(gè)最簡(jiǎn)單的讀寫鎖。

到此這篇關(guān)于簡(jiǎn)單探討一下python線程鎖的文章就介紹到這了,更多相關(guān)python 線程鎖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

英吉沙县| 武穴市| 安仁县| 玉山县| 景宁| 铜山县| 洮南市| 中牟县| 重庆市| 马山县| 磐安县| 贺兰县| 喜德县| 广河县| 遂溪县| 永和县| 石阡县| 博湖县| 嘉黎县| 玉屏| 桐城市| 城口县| 宁明县| 水富县| 白山市| 绥中县| 酉阳| 沿河| 于田县| 吉首市| 建始县| 宝应县| 闻喜县| 杭锦后旗| 金山区| 中江县| 万山特区| 宜宾市| 彩票| 伊金霍洛旗| 新竹市|