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

您的位置:首頁技術文章
文章詳情頁

Python多線程操作之互斥鎖、遞歸鎖、信號量、事件實例詳解

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

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

互斥鎖: 為什么要有互斥鎖:由于多線程是并行的,如果某一線程取出了某一個數據將要進行操作,但它還沒有那么快執行完操作,這時候如果另外一個線程也要操作這個數據,那么這個數據可能會因為兩次操作而發生錯誤

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

Python多線程操作之互斥鎖、遞歸鎖、信號量、事件實例詳解

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

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

import time,threadingx=6def run1(): lock.acquire() global x print('run1我拿到了數據,x=',x) print('我現在還不想操作,先睡一下') time.sleep(3) print('再看一下數據,穩一穩,x=',x) x+=1 print('run1操作完畢:x=',x) lock.release()def run2(): lock.acquire() global x print('run2我拿到了數據:', x) x+=1 print('run2操作完畢:x=',x) lock.release()lock=threading.Lock()#生成一個鎖對象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,所以變成了串行

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

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

Python多線程操作之互斥鎖、遞歸鎖、信號量、事件實例詳解

遞歸鎖: 為什么要有遞歸鎖:互斥鎖本質上是阻止其他線程進入,如果有兩個需要阻止其他線程進入的操作【像兩個人過獨木橋】,那么需要兩個鎖,而想要鎖上第二個如果直接用第一個鎖的acquire會失敗,因為第一個鎖還沒release,我們可以選擇再定義一個互斥鎖對象來acquire,但這僅僅是兩層的情況下,如果多層的吧,那么就需要定義好幾個互斥鎖對象了【而且由于對象變多,有時候會因為互相調用鎖而發生死鎖】。遞歸鎖就是為了處理這種情況,遞歸鎖對象允許多次acquire和多次release 發生死鎖的情況[A拿到A鎖,想要拿B鎖,B拿著B鎖,想要A鎖]

【以過獨木橋為例】:橋只能容一個人通過,A只能看得到北邊橋上有沒有人,看不到南邊橋有沒有人,當他看到北邊橋沒人就會過橋,等到他到橋中間才能看到南邊橋有沒有人,B情況相反:【于是當兩個人一起過橋的時候就會發生死鎖】

import threading,time'''A只能看得到北邊橋上有沒有人,看不到南邊橋有沒有人,當他看到北邊橋沒人就會過橋,等到他到橋中間才能看到南邊橋有沒有人'''def A(): lockNorth.acquire()#拿到北邊橋的鎖 print('A過橋北') time.sleep(3)#過橋中 lockSorth.acquire()#企圖過到南邊橋, print('A過橋南') time.sleep(3) # 過橋中 lockSorth.release() lockNorth.release() print('A過橋成功')'''B只能看得到南邊橋上有沒有人,看不到北邊橋有沒有人,當他看到南邊橋沒人就會過橋,等到他到橋中間才能看到北邊橋有沒有人'''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多線程操作之互斥鎖、遞歸鎖、信號量、事件實例詳解

遞歸鎖的本質是:本質上還是一個鎖,但如果在一個線程里面可以多次acquire?!疽驗橹挥幸粋€鎖,所以不會發生互相調用的死鎖,而因為可以多次調用,所以可以鎖多次】 如何使用遞歸鎖: 定義一個鎖對象:遞歸鎖對象=threading.RLock() 請求鎖:鎖對象.acquire() 釋放鎖:鎖對象.release()

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

import threading,time'''A只能看得到北邊橋上有沒有人,看不到南邊橋有沒有人,當他看到北邊橋沒人就會過橋,等到他到橋中間才能看到南邊橋有沒有人'''def A(): lock.acquire()#拿到北邊橋的鎖 print('A過橋北') time.sleep(3)#過橋中 lock.acquire()#企圖過到南邊橋, print('A過橋南') time.sleep(3) # 過橋中 lock.release() lock.release() print('A過橋成功')'''B只能看得到南邊橋上有沒有人,看不到北邊橋有沒有人,當他看到南邊橋沒人就會過橋,等到他到橋中間才能看到北邊橋有沒有人'''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多線程操作之互斥鎖、遞歸鎖、信號量、事件實例詳解

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

信號量: 什么是信號量:

Python多線程操作之互斥鎖、遞歸鎖、信號量、事件實例詳解

信號量可以限制進入的線程的數量。

如何使用信號量: 創建信號量對象:信號量對象=threading.BoundedSemaphore(x),x是限制進程的數量 當有進程需要進入的時候,調用acquire()來減少信號量:信號量對象.acquire() 當有進程離開的時候,調用release()來增加信號量:信號量對象.release()

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

Python多線程操作之互斥鎖、遞歸鎖、信號量、事件實例詳解

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

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

Python多線程操作之互斥鎖、遞歸鎖、信號量、事件實例詳解

更多關于Python相關內容感興趣的讀者可查看本站專題:《Python進程與線程操作技巧總結》、《Python數據結構與算法教程》、《Python函數使用技巧總結》、《Python字符串操作技巧匯總》、《Python入門與進階經典教程》、《Python+MySQL數據庫程序設計入門教程》及《Python常見數據庫操作技巧匯總》

希望本文所述對大家Python程序設計有所幫助。

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲人亚洲人色久| 国产伊人久久| 亚洲精品1区2区| 亚洲午夜在线| 欧美aa在线观看| 久久毛片亚洲| 日韩在线观看不卡| 免费国产自久久久久三四区久久 | 影音先锋久久精品| 蜜桃视频在线观看一区| 亚洲性视频在线| 日本精品国产| 国产伦理久久久久久妇女| 97久久亚洲| 国产精品久久久久9999高清| 福利视频一区| 99久久视频| 91九色综合| 色爱综合av| 日韩av不卡在线观看| 日韩欧美精品综合| 日韩一区二区三区四区五区| 国产精品yjizz视频网| 久久大逼视频| а√天堂8资源在线| 丝袜美腿一区二区三区| 久久wwww| 在线一区免费观看| 国产欧美一区二区三区国产幕精品| 亚洲爱爱视频| 国产精品网在线观看| 亚洲电影在线一区二区三区| 日韩不卡一区二区| 99久久精品网站| 国产精品99久久免费观看| 欧美日韩精品一本二本三本 | 精精国产xxxx视频在线播放| 综合国产视频| 国产一在线精品一区在线观看| 蜜桃免费网站一区二区三区| 国产日韩欧美三区| 久久97久久97精品免视看秋霞| 久久中文字幕av| 欧美日韩亚洲一区三区| 国产欧洲在线| 免费不卡在线视频| 久久99精品久久久久久园产越南| 99精品一区| 日韩高清在线观看一区二区| 日韩伦理在线一区| 中文字幕av一区二区三区人| 老色鬼精品视频在线观看播放| 欧美日韩国产免费观看视频| 欧美一区影院| 日本不卡不码高清免费观看| 国产精品15p| 亚洲精品精选| 最新亚洲激情| 99精品在线| 91亚洲国产| 欧美1区2区3| 欧美亚洲一区二区三区| 一区二区三区四区在线观看国产日韩 | 精品一区免费| 97精品国产福利一区二区三区| 国产精品亚洲欧美一级在线| 亚洲午夜免费| 亚洲免费在线| 黄色成人91| 波多视频一区| 国产精品13p| 成人午夜毛片| 久久免费影院| 国产伦精品一区二区三区视频| 亚洲乱码久久| 日本 国产 欧美色综合| 91久久中文| 美女网站一区| 性欧美xxxx免费岛国不卡电影| 超碰超碰人人人人精品| 日韩欧乱色一区二区三区在线| 欧美精品一区二区三区精品| 国产在线视频欧美一区| 欧美日韩亚洲三区| 一区二区视频欧美| 日韩免费久久| 精品资源在线| 久久国产欧美日韩精品| 亚洲视频播放| 成人羞羞视频播放网站| 美腿丝袜亚洲三区| 午夜精品福利影院| 中文在线一区| 久久一区二区中文字幕| 国产一区二区三区四区五区 | 在线一区视频观看| 日韩国产在线观看一区| 在线看片日韩| 亚洲另类黄色| 日韩高清不卡一区| 国产欧美自拍| 久久精品国产亚洲aⅴ| 精品国产18久久久久久二百| 国产一区二区三区久久| 久久字幕精品一区| 国产+成+人+亚洲欧洲在线| 黑人精品一区| 亚洲午夜久久久久久尤物| 99成人在线| 中文字幕av一区二区三区四区| 日韩精品视频在线看| 国产麻豆精品| 国产va免费精品观看精品视频| 不卡一二三区| 欧美日韩国产高清| 婷婷精品在线观看| 国产精品啊v在线| 日韩av片子| 1024精品一区二区三区| 在线亚洲自拍| 日韩午夜视频在线| 国产精品久久久久久模特| 精品美女视频| 久久黄色影院| 日韩黄色大片| 91tv亚洲精品香蕉国产一区| 午夜欧美巨大性欧美巨大| 欧美日韩精品免费观看视完整| 成人在线免费观看网站| 国产成人黄色| 国产精品亚洲一区二区三区在线观看| 福利精品一区| 欧美不卡高清一区二区三区| 日韩和的一区二在线| 999久久久精品国产| 欧美日韩国产综合网| 亚洲欧美视频| 亚州精品视频| 久久gogo国模啪啪裸体| 福利一区和二区| 视频福利一区| 国产亚洲永久域名| 欧美亚洲tv| 国产成人在线中文字幕| 欧美大黑bbbbbbbbb在线| 日韩精品欧美成人高清一区二区| 国模大尺度视频一区二区| 亚洲二区三区不卡| 国产精品亚洲四区在线观看 | 欧美成人精品午夜一区二区| 久久理论电影| 日本91福利区| 色综合狠狠操| 亚洲一区日韩在线| 久久精品一本| 免费在线欧美视频| 日韩成人精品一区| 亚洲精品精选| 日韩免费高清| 91麻豆精品激情在线观看最新| 日韩一区亚洲二区| 日韩精品欧美精品| 久久国产主播| 国产精品久久乐| 亚洲一区国产| 国产成人久久| 国产精品一线天粉嫩av| 国产欧美亚洲一区| 国产66精品| 亚洲一区不卡| 国产精品99久久免费观看| 日韩欧美一区二区三区在线视频 | 日韩精品视频在线看| 国产成人精品一区二区免费看京 | 麻豆一区二区三| 九一精品国产| 国产午夜久久av| 亚洲欧美一区在线| 精品一级视频| 丝袜美腿高跟呻吟高潮一区| 亚洲午夜天堂| 国产精品羞羞答答在线观看| 日韩专区一卡二卡| 人人香蕉久久| 精品久久久久中文字幕小说| 日本不卡视频在线| 亚洲中字黄色| 久久三级福利| 国产精品亚洲欧美一级在线| 美女被久久久| 久久精品国产www456c0m| 欧美激情三区| 日韩一区二区三免费高清在线观看| 秋霞影视一区二区三区| 欧美1区二区| 欧美伊人久久| 深夜日韩欧美| 亚洲欧洲另类| 免费污视频在线一区| 国产高清精品二区|