日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

Python多線程操作之互斥鎖、遞歸鎖、信號(hào)量、事件實(shí)例詳解

瀏覽:64日期:2022-08-01 13:45:18

本文實(shí)例講述了Python多線程操作之互斥鎖、遞歸鎖、信號(hào)量、事件。分享給大家供大家參考,具體如下:

互斥鎖: 為什么要有互斥鎖:由于多線程是并行的,如果某一線程取出了某一個(gè)數(shù)據(jù)將要進(jìn)行操作,但它還沒有那么快執(zhí)行完操作,這時(shí)候如果另外一個(gè)線程也要操作這個(gè)數(shù)據(jù),那么這個(gè)數(shù)據(jù)可能會(huì)因?yàn)閮纱尾僮鞫l(fā)生錯(cuò)誤

import time,threadingx=6def run1(): print('run1我拿到了數(shù)據(jù):',x) print('我現(xiàn)在還不想操作,先睡一下') time.sleep(3) print('再看一下數(shù)據(jù),穩(wěn)一穩(wěn)',x)def run2(): global x print('run2我拿到了數(shù)據(jù):', x) x=5 print(x)t1=threading.Thread(target=run1)t2=threading.Thread(target=run2)t1.start()t2.start()t1.join()t2.join()

Python多線程操作之互斥鎖、遞歸鎖、信號(hào)量、事件實(shí)例詳解

而多線程的互斥鎖機(jī)制本質(zhì)上是:申請一個(gè)鎖,A線程拿了鑰匙【acquire】之后,如果B也想拿到鑰匙是不行的,只有等A把鑰匙還回來【release】才行 如何使用互斥鎖: 定義一個(gè)鎖對象:鎖對象=threading.Lock() 請求鎖:鎖對象.acquire() 釋放鎖:鎖對象.release()

使用互斥鎖來更改上段代碼

import time,threadingx=6def run1(): lock.acquire() global x print('run1我拿到了數(shù)據(jù),x=',x) print('我現(xiàn)在還不想操作,先睡一下') time.sleep(3) print('再看一下數(shù)據(jù),穩(wěn)一穩(wěn),x=',x) x+=1 print('run1操作完畢:x=',x) lock.release()def run2(): lock.acquire() global x print('run2我拿到了數(shù)據(jù):', x) x+=1 print('run2操作完畢:x=',x) lock.release()lock=threading.Lock()#生成一個(gè)鎖對象t1=threading.Thread(target=run1)t2=threading.Thread(target=run2)t1.start()t2.start()start_time=time.time()t1.join()t2.join()print('最終的x=',x)print(time.time()-start_time)#3.0多說明,由于受到鎖的影響,run2要等待run1釋放lock,所以變成了串行

這種互斥鎖在操作系統(tǒng)中可以稱作“臨界區(qū)”,如果想了解更多:

https://baike.baidu.com/item/%E4%B8%B4%E7%95%8C%E5%8C%BA/8942134?fr=aladdin

Python多線程操作之互斥鎖、遞歸鎖、信號(hào)量、事件實(shí)例詳解

遞歸鎖: 為什么要有遞歸鎖:互斥鎖本質(zhì)上是阻止其他線程進(jìn)入,如果有兩個(gè)需要阻止其他線程進(jìn)入的操作【像兩個(gè)人過獨(dú)木橋】,那么需要兩個(gè)鎖,而想要鎖上第二個(gè)如果直接用第一個(gè)鎖的acquire會(huì)失敗,因?yàn)榈谝粋€(gè)鎖還沒release,我們可以選擇再定義一個(gè)互斥鎖對象來acquire,但這僅僅是兩層的情況下,如果多層的吧,那么就需要定義好幾個(gè)互斥鎖對象了【而且由于對象變多,有時(shí)候會(huì)因?yàn)榛ハ嗾{(diào)用鎖而發(fā)生死鎖】。遞歸鎖就是為了處理這種情況,遞歸鎖對象允許多次acquire和多次release 發(fā)生死鎖的情況[A拿到A鎖,想要拿B鎖,B拿著B鎖,想要A鎖]

【以過獨(dú)木橋?yàn)槔浚簶蛑荒苋菀粋€(gè)人通過,A只能看得到北邊橋上有沒有人,看不到南邊橋有沒有人,當(dāng)他看到北邊橋沒人就會(huì)過橋,等到他到橋中間才能看到南邊橋有沒有人,B情況相反:【于是當(dāng)兩個(gè)人一起過橋的時(shí)候就會(huì)發(fā)生死鎖】

import threading,time'''A只能看得到北邊橋上有沒有人,看不到南邊橋有沒有人,當(dāng)他看到北邊橋沒人就會(huì)過橋,等到他到橋中間才能看到南邊橋有沒有人'''def A(): lockNorth.acquire()#拿到北邊橋的鎖 print('A過橋北') time.sleep(3)#過橋中 lockSorth.acquire()#企圖過到南邊橋, print('A過橋南') time.sleep(3) # 過橋中 lockSorth.release() lockNorth.release() print('A過橋成功')'''B只能看得到南邊橋上有沒有人,看不到北邊橋有沒有人,當(dāng)他看到南邊橋沒人就會(huì)過橋,等到他到橋中間才能看到北邊橋有沒有人'''def B(): lockSorth.acquire() # 企圖過到南邊橋, print('B過橋南') time.sleep(3) # 過橋中 lockNorth.acquire() # 拿到北邊橋的鎖 print('B過橋北') time.sleep(3) # 過橋中 lockNorth.release() lockSorth.release() print('B過橋成功')lockNorth=threading.Lock()lockSorth=threading.Lock()tA=threading.Thread(target=A)tB=threading.Thread(target=B)tA.start()tB.start()tA.join()tB.join()

Python多線程操作之互斥鎖、遞歸鎖、信號(hào)量、事件實(shí)例詳解

遞歸鎖的本質(zhì)是:本質(zhì)上還是一個(gè)鎖,但如果在一個(gè)線程里面可以多次acquire。【因?yàn)橹挥幸粋€(gè)鎖,所以不會(huì)發(fā)生互相調(diào)用的死鎖,而因?yàn)榭梢远啻握{(diào)用,所以可以鎖多次】 如何使用遞歸鎖: 定義一個(gè)鎖對象:遞歸鎖對象=threading.RLock() 請求鎖:鎖對象.acquire() 釋放鎖:鎖對象.release()

使用遞歸鎖來解決上面的死鎖問題:

import threading,time'''A只能看得到北邊橋上有沒有人,看不到南邊橋有沒有人,當(dāng)他看到北邊橋沒人就會(huì)過橋,等到他到橋中間才能看到南邊橋有沒有人'''def A(): lock.acquire()#拿到北邊橋的鎖 print('A過橋北') time.sleep(3)#過橋中 lock.acquire()#企圖過到南邊橋, print('A過橋南') time.sleep(3) # 過橋中 lock.release() lock.release() print('A過橋成功')'''B只能看得到南邊橋上有沒有人,看不到北邊橋有沒有人,當(dāng)他看到南邊橋沒人就會(huì)過橋,等到他到橋中間才能看到北邊橋有沒有人'''def B(): lock.acquire() # 拿南橋鎖, print('B過橋南') time.sleep(3) # 過橋中 lock.acquire() # 企圖拿北橋的鎖 print('B過橋北') time.sleep(3) # 過橋中 lock.release() lock.release() print('B過橋成功')lock=threading.RLock()tA=threading.Thread(target=A)tB=threading.Thread(target=B)tA.start()tB.start()tA.join()tB.join()

Python多線程操作之互斥鎖、遞歸鎖、信號(hào)量、事件實(shí)例詳解

【由于本質(zhì)是一把鎖,A拿到鎖后,B要等待】

信號(hào)量: 什么是信號(hào)量:

Python多線程操作之互斥鎖、遞歸鎖、信號(hào)量、事件實(shí)例詳解

信號(hào)量可以限制進(jìn)入的線程的數(shù)量。

如何使用信號(hào)量: 創(chuàng)建信號(hào)量對象:信號(hào)量對象=threading.BoundedSemaphore(x),x是限制進(jìn)程的數(shù)量 當(dāng)有進(jìn)程需要進(jìn)入的時(shí)候,調(diào)用acquire()來減少信號(hào)量:信號(hào)量對象.acquire() 當(dāng)有進(jìn)程離開的時(shí)候,調(diào)用release()來增加信號(hào)量:信號(hào)量對象.release()

import threading,timedef run(): s.acquire() print('hello') time.sleep(1.5) s.release()s=threading.BoundedSemaphore(3)#限制3個(gè)threading_list=[]for i in range(12):#創(chuàng)建12個(gè)線程 obj=threading.Thread(target=run) obj.setDaemon(True) # 設(shè)置守護(hù)線程,避免干擾主線程運(yùn)行,并行等待 obj.start()for i in range(4): print('')#為了把結(jié)果分割,可以清楚看出分為了三組 time.sleep(1.5)#結(jié)果分為三組是因?yàn)檫\(yùn)行的太快了,三個(gè)線程裝入的時(shí)間差太小

Python多線程操作之互斥鎖、遞歸鎖、信號(hào)量、事件實(shí)例詳解

事件: 什么是事件:當(dāng)發(fā)生線程發(fā)生一件事的時(shí)候如果要提醒另外一個(gè)線程,使用事件。雙方共享該事件對象【等待的一方會(huì)阻塞而進(jìn)行等待】,當(dāng)一方更改事件對象的時(shí)候,另外一方也能知道【以讀者-寫者為例:讀者要等寫者告訴他去讀才會(huì)去讀,寫者寫完后要設(shè)置一個(gè)事件,當(dāng)該事件設(shè)置時(shí),讀者就會(huì)來讀】 如何使用事件: 創(chuàng)建事件對象:事件對象=threading.Event() 設(shè)置事件:事件對象.set() 判斷事件是否set:事件對象.is_set(),等待事件set:事件對象.wait() 清除事件:事件對象.clear()

import threading,timedef read(): while True: if event.is_set(): print('事件已設(shè)置,我要讀了!!!!') time.sleep(1) else:#事件未設(shè)置 print('還沒寫好,我要等咯') event.wait()#那么就等著咯 #如果等到了 print('終于等到了!那么我又可以讀了') time.sleep(1)def write(): event.clear()#初始設(shè)空 while True: time.sleep(3)#寫 event.set()#設(shè)置事件,一旦set,那么讀者wait就有返回了,讀者可以繼續(xù)運(yùn)行了 print('write:寫好了') time.sleep(2)#等人讀 event.clear()#清除事件event=threading.Event() #創(chuàng)建事件對象t1=threading.Thread(target=write)t2=threading.Thread(target=read)t1.start()t2.start()t1.join()t2.join()'''結(jié)果顯示:讀者確實(shí)一直在等待寫者寫好'''

Python多線程操作之互斥鎖、遞歸鎖、信號(hào)量、事件實(shí)例詳解

更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python進(jìn)程與線程操作技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門與進(jìn)階經(jīng)典教程》、《Python+MySQL數(shù)據(jù)庫程序設(shè)計(jì)入門教程》及《Python常見數(shù)據(jù)庫操作技巧匯總》

希望本文所述對大家Python程序設(shè)計(jì)有所幫助。

標(biāo)簽: Python 編程
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
美女少妇全过程你懂的久久| 宅男噜噜噜66国产日韩在线观看| 色爱综合av| 免费看精品久久片| 午夜国产一区二区| 日韩精品电影| 久久免费视频66| 日韩精品亚洲专区| 久久福利精品| 99国产精品99久久久久久粉嫩| 国产日韩高清一区二区三区在线 | 久久精品国产精品亚洲毛片| 亚洲免费观看高清完整版在线观| 99亚洲精品| 中文字幕一区二区三区在线视频| 日韩久久精品| 日韩中文视频| 久久人人99| 日韩国产一区| 理论片午夜视频在线观看| 国产乱子精品一区二区在线观看| 69堂免费精品视频在线播放| 日韩久久99| 亚洲日本免费电影| 欧美日韩1区| 日韩高清不卡一区| 日韩国产一二三区| 久久精品伊人| 国产伊人久久| 精品国产不卡一区二区| 国际精品欧美精品| 天堂av在线| 99国产精品免费视频观看| 欧美福利在线| 99在线观看免费视频精品观看| 国产精品日本| 91嫩草亚洲精品| 日本精品在线中文字幕| 99免费精品| 久久久久国产精品一区三寸 | 日韩深夜视频| 夜夜嗨一区二区| 一区二区视频欧美| 六月天综合网| 亚洲日本欧美| 欧美一区=区三区| 国产精品1区| 久久国内精品自在自线400部| 国模大尺度视频一区二区| 久久精品亚洲欧美日韩精品中文字幕| 亚洲精品97| 亚洲三级毛片| 免费在线播放第一区高清av| 日本麻豆一区二区三区视频| 麻豆国产精品视频| 国内精品亚洲| 午夜精品网站| 日韩精品中文字幕吗一区二区| 国产亚洲一区二区三区啪| 欧美日韩亚洲一区| 日韩在线欧美| 视频一区视频二区在线观看| 五月激激激综合网色播| 欧洲av不卡| 亚洲理论在线| 美女视频网站久久| 日韩影院免费视频| 久久99视频| 999精品色在线播放| 日韩国产欧美三级| 高清av不卡| 中文字幕一区二区三区四区久久| 你懂的亚洲视频| 欧美 日韩 国产一区二区在线视频 | 蜜桃久久久久| 日韩一区三区| 亚洲精品伊人| 999精品一区| 婷婷久久免费视频| 国产成年精品| 日本综合视频| 日韩在线中文| 日本不卡高清| 亚洲视频二区| 色偷偷偷在线视频播放| 日韩中文欧美在线| 久久久水蜜桃av免费网站| 国产精品一区二区三区四区在线观看 | 亚洲影院天堂中文av色| 老司机精品视频在线播放| 亚洲精品a级片| 欧美精品aa| 在线综合亚洲| 超碰成人av| 久久精品免费看| 黄色aa久久| 先锋影音国产一区| 国产aa精品| 亚洲九九精品| av在线日韩| 欧美亚洲国产日韩| 1024精品一区二区三区| 91精品蜜臀一区二区三区在线| 国产亚洲电影| 精品中文字幕一区二区三区av| 国产无遮挡裸体免费久久| 国产91精品对白在线播放| 日韩一区精品| 不卡一区2区| 国产一区二区亚洲| 久久不射网站| 日韩在线中文| 国产精品尤物| 免费人成黄页网站在线一区二区| аⅴ资源天堂资源库在线| 日本精品久久| 今天的高清视频免费播放成人| 另类综合日韩欧美亚洲| 日韩精品三级| 在线亚洲自拍| 亚洲精品.com| 久久精品国产亚洲一区二区三区| 综合国产精品| 国产精品普通话对白| 超级白嫩亚洲国产第一| 中文字幕一区二区三区四区久久| 久久免费视频66| 久久精品72免费观看| 中文精品电影| 国产精品婷婷| 国产一区二区中文| 色黄视频在线观看| 久久97久久97精品免视看秋霞| 日韩国产一区二| 9色国产精品| 在线观看精品| 国产aa精品| 精品一级视频| 欧美激情综合| 国产精品一区二区免费福利视频 | 日韩精品免费一区二区夜夜嗨 | 日韩欧美午夜| 成人国产精品久久| 久久国产免费看| 欧美精品中文字幕亚洲专区| 欧美在线资源| 99在线|亚洲一区二区| 日韩欧美精品一区| 国产成人免费| 精品免费在线| 久久久久久自在自线| 毛片在线网站| 亚洲精品成人图区| 新版的欧美在线视频| 韩国女主播一区二区三区| 国产精品视频一区二区三区综合| 国产精品尤物| 老牛国内精品亚洲成av人片| 免费在线观看一区| 国产69精品久久| 色老板在线视频一区二区| 国产不卡一区| 亚洲不卡av不卡一区二区| www.51av欧美视频| 国产日韩亚洲| 久久黄色影视| 欧美91在线| 久久久久久亚洲精品美女| 美日韩一区二区三区| 成人在线视频免费看| 久久激情综合网| 日韩欧美不卡| 精品在线播放| 亚洲欧美网站在线观看| 日韩av成人高清| 久久精品一区二区三区中文字幕| 三级在线看中文字幕完整版| 欧美网站在线| 日本大胆欧美人术艺术动态| 综合干狼人综合首页| 国产午夜精品一区在线观看| 黄色网一区二区| 亚洲特级毛片| 在线看片日韩| 福利片在线一区二区| 亚洲韩日在线| 男人的天堂亚洲一区| 亚洲精品一级| 中文一区一区三区高中清不卡免费| 欧美日韩精品一区二区三区在线观看| 91亚洲国产| 在线观看精品| а√天堂8资源中文在线| 日本午夜精品久久久| 欧美精品不卡| 免费在线小视频| 亚洲精品国产日韩| 91嫩草亚洲精品| 久久精品高清| 久久一区欧美|