电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

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

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

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

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多線程操作之互斥鎖、遞歸鎖、信號量、事件實例詳解

而多線程的互斥鎖機制本質(zhì)上是:申請一個鎖,A線程拿了鑰匙【acquire】之后,如果B也想拿到鑰匙是不行的,只有等A把鑰匙還回來【release】才行 如何使用互斥鎖: 定義一個鎖對象:鎖對象=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()#生成一個鎖對象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多線程操作之互斥鎖、遞歸鎖、信號量、事件實例詳解

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

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

import threading,time'''A只能看得到北邊橋上有沒有人,看不到南邊橋有沒有人,當(dāng)他看到北邊橋沒人就會過橋,等到他到橋中間才能看到南邊橋有沒有人'''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)他看到南邊橋沒人就會過橋,等到他到橋中間才能看到北邊橋有沒有人'''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多線程操作之互斥鎖、遞歸鎖、信號量、事件實例詳解

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

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

import threading,time'''A只能看得到北邊橋上有沒有人,看不到南邊橋有沒有人,當(dāng)他看到北邊橋沒人就會過橋,等到他到橋中間才能看到南邊橋有沒有人'''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)他看到南邊橋沒人就會過橋,等到他到橋中間才能看到北邊橋有沒有人'''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多線程操作之互斥鎖、遞歸鎖、信號量、事件實例詳解

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

信號量: 什么是信號量:

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

信號量可以限制進入的線程的數(shù)量。

如何使用信號量: 創(chuàng)建信號量對象:信號量對象=threading.BoundedSemaphore(x),x是限制進程的數(shù)量 當(dāng)有進程需要進入的時候,調(diào)用acquire()來減少信號量:信號量對象.acquire() 當(dāng)有進程離開的時候,調(diào)用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):#創(chuàng)建12個線程 obj=threading.Thread(target=run) obj.setDaemon(True) # 設(shè)置守護線程,避免干擾主線程運行,并行等待 obj.start()for i in range(4): print('')#為了把結(jié)果分割,可以清楚看出分為了三組 time.sleep(1.5)#結(jié)果分為三組是因為運行的太快了,三個線程裝入的時間差太小

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

事件: 什么是事件:當(dāng)發(fā)生線程發(fā)生一件事的時候如果要提醒另外一個線程,使用事件。雙方共享該事件對象【等待的一方會阻塞而進行等待】,當(dāng)一方更改事件對象的時候,另外一方也能知道【以讀者-寫者為例:讀者要等寫者告訴他去讀才會去讀,寫者寫完后要設(shè)置一個事件,當(dāng)該事件設(shè)置時,讀者就會來讀】 如何使用事件: 創(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ù)運行了 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é)果顯示:讀者確實一直在等待寫者寫好'''

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

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

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

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 气体热式流量计-定量控制流量计(空气流量计厂家)-湖北南控仪表科技有限公司 | 桁架机器人_桁架机械手_上下料机械手_数控车床机械手-苏州清智科技装备制造有限公司 | 小型铜米机-干式铜米机-杂线全自动铜米机-河南鑫世昌机械制造有限公司 | 旅游规划_旅游策划_乡村旅游规划_景区规划设计_旅游规划设计公司-北京绿道联合旅游规划设计有限公司 | 衡阳耐适防护科技有限公司——威仕盾焊接防护用品官网/焊工手套/焊接防护服/皮革防护手套 | 环压强度试验机-拉链拉力试验机-上海倾技仪器仪表科技有限公司 | 耐高温电缆厂家-远洋高温电缆 | 利浦顿蒸汽发生器厂家-电蒸汽发生器/燃气蒸汽发生器_湖北利浦顿热能科技有限公司官网 | 精密五金冲压件_深圳五金冲压厂_钣金加工厂_五金模具加工-诚瑞丰科技股份有限公司 | 钢骨架轻型板_膨石轻型板_钢骨架轻型板价格_恒道新材料 | 污水/卧式/潜水/钻井/矿用/大型/小型/泥浆泵,价格,参数,型号,厂家 - 安平县鼎千泵业制造厂 | 蜘蛛车-高空作业平台-升降机-高空作业车租赁-臂式伸缩臂叉装车-登高车出租厂家 - 普雷斯特机械设备(北京)有限公司 | 扫地车厂家-山西洗地机-太原电动扫地车「大同朔州吕梁晋中忻州长治晋城洗地机」山西锦力环保科技有限公司 | 半自动预灌装机,卡式瓶灌装机,注射器灌装机,给药器灌装机,大输液灌装机,西林瓶灌装机-长沙一星制药机械有限公司 | 品牌设计_VI设计_电影海报设计_包装设计_LOGO设计-Bacross新越品牌顾问 | 世纪豪门官网 世纪豪门集成吊顶加盟电话 世纪豪门售后电话 | 沧州友城管业有限公司-内外涂塑钢管-大口径螺旋钢管-涂塑螺旋管-保温钢管生产厂家 | 台湾HIWIN上银直线模组|导轨滑块|TBI滚珠丝杆丝杠-深圳汉工 | 广州办公室设计,办公室装修,写字楼设计,办公室装修公司_德科 | 冷藏车-东风吸污车-纯电动环卫车-污水净化车-应急特勤保障车-程力专汽厂家-程力专用汽车股份有限公司销售二十一分公司 | 泉州陶瓷pc砖_园林景观砖厂家_石英砖地铺石价格 _福建暴风石英砖 | 美国PARKER齿轮泵,美国PARKER柱塞泵,美国PARKER叶片泵,美国PARKER电磁阀,美国PARKER比例阀-上海维特锐实业发展有限公司二部 | 微型气象仪_气象传感器_防爆气象传感器-天合传感器大全 | 山东石英砂过滤器,除氟过滤器「价格低」-淄博胜达水处理 | 定制/定做衬衫厂家/公司-衬衫订做/订制价格/费用-北京圣达信 | 杰福伦_磁致伸缩位移传感器_线性位移传感器-意大利GEFRAN杰福伦-河南赉威液压科技有限公司 | 板框压滤机-隔膜压滤机-厢式压滤机生产厂家-禹州市君工机械设备有限公司 | 武汉EPS线条_EPS装饰线条_EPS构件_湖北博欧EPS线条厂家 | hdpe土工膜-防渗膜-复合土工膜-长丝土工布价格-厂家直销「恒阳新材料」-山东恒阳新材料有限公司 ETFE膜结构_PTFE膜结构_空间钢结构_膜结构_张拉膜_浙江萬豪空间结构集团有限公司 | 上海宿田自动化设备有限公司-双面/平面/单面贴标机 | 伊卡洛斯软装首页-电动窗帘,别墅窗帘,定制窗帘,江浙沪1000+别墅窗帘案例 | 环氧乙烷灭菌器_压力蒸汽灭菌器_低温等离子过氧化氢灭菌器 _低温蒸汽甲醛灭菌器_清洗工作站_医用干燥柜_灭菌耗材-环氧乙烷灭菌器_脉动真空压力蒸汽灭菌器_低温等离子灭菌设备_河南省三强医疗器械有限责任公司 | 影视模板素材_原创专业影视实拍视频素材-8k像素素材网 | 快干水泥|桥梁伸缩缝止水胶|伸缩缝装置生产厂家-广东广航交通科技有限公司 | 房屋质量检测-厂房抗震鉴定-玻璃幕墙检测-房屋安全鉴定机构 | 矿用履带式平板车|探水钻机|气动架柱式钻机|架柱式液压回转钻机|履带式钻机-启睿探水钻机厂家 | bng防爆挠性连接管-定做金属防爆挠性管-依客思防爆科技 | 精密钢管,冷拔精密无缝钢管,精密钢管厂,精密钢管制造厂家,精密钢管生产厂家,山东精密钢管厂家 | 企典软件一站式企业管理平台,可私有、本地化部署!在线CRM客户关系管理系统|移动办公OA管理系统|HR人事管理系统|人力 | 移动机器人产业联盟官网 | 寮步纸箱厂_东莞纸箱厂 _东莞纸箱加工厂-东莞市寮步恒辉纸制品厂 |