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

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

淺談python鎖與死鎖問題

瀏覽:7日期:2022-07-14 09:06:28

如果你學過操作系統,那么對于鎖應該不陌生。鎖的含義是線程鎖,可以用來指定某一個邏輯或者是資源同一時刻只能有一個線程訪問。這個很好理解,就好像是有一個房間被一把鎖鎖住了,只有拿到鑰匙的人才能進入。每一個人從房間門口拿到鑰匙進入房間,出房間的時候會把鑰匙再放回到門口。這樣下一個到門口的人就可以拿到鑰匙了。這里的房間就是某一個資源或者是一段邏輯,而拿取鑰匙的人其實指的是一個線程。

加鎖的原因

我們明白了鎖的原理,不禁有了一個問題,我們為什么需要鎖呢,它在哪些場景當中會用到呢?

其實它的使用場景非常廣,我們舉一個非常簡單的例子,就是淘寶買東西。我們都知道商家的庫存都是有限的,賣掉一個少一個。假如說當前某個商品庫存只剩下一個,但當下卻有兩個人同時購買。兩個人同時購買也就是有兩個請求同時發起購買請求,如果我們不加鎖的話,兩個線程同時查詢到商品的庫存是1,大于0,進行購買邏輯之后,減一。由于兩個線程同時執行,所以最后商品的庫存會變成-1。

顯然商品的庫存不應該是一個負數,所以我們需要避免這種情況發生。通過加鎖可以完美解決這個問題。我們規定一次只能有一個線程發起購買的請求,那么這樣當一個線程將庫存減到0的時候,第二個請求就無法修改了,就保證了數據的準確性。

代碼實現

那么在Python當中,我們怎么樣來實現這個鎖呢?

其實很簡單,threading庫當中已經為我們提供了線程的工具,我們直接拿過來用就可以了。我們通過使用threading當中的Lock對象, 可以很輕易的實現方法加鎖的功能。

import threadingclass PurchaseRequest: ’’’ 初始化庫存與鎖 ’’’ def __init__(self, initial_value = 0): self._value = initial_value self._lock = threading.Lock() def incr(self,delta=1): ’’’ 加庫存 ’’’ self._lock.acquire() self._value += delta self._lock.release() def decr(self,delta=1): ’’’ 減庫存 ’’’ self._lock.acquire() self._value -= delta self._lock.release()

我們從代碼當中就可以很輕易的看出Lock這個對象的使用方法,我們在進入加鎖區(資源搶占區)之前,我們需要先使用lock.acquire()方法獲取鎖。Lock對象可以保證同一時刻只能有一個線程獲取鎖,只有獲取了鎖之后才會繼續往下執行。當我們執行完成之后,我們需要把鎖“放回門口”,所以需要再調用一下release方法,表示鎖的釋放。

這里有一個小問題是很多程序員在編程的時候總是會忘記release,導致不必要的bug,而且這種分布式場景當中的bug很難通過測試發現。因為測試的時候往往很難測試并發場景,code review的時候也很容易忽略,因此一旦泄露了還是挺難發現的。

為了解決這個問題,Lock還提供了一種改進的用法,就是使用with語句。with語句我們之前在使用文件的時候用到過,使用with可以替我們完成try catch以及資源回收等工作,我們只管用就完事了。這里也是一樣,使用with之后我們就可以不用管鎖的申請和釋放了,直接寫代碼就行,所以上面的代碼可以改寫成這樣:

import threadingclass PurchaseRequest: ’’’ 初始化庫存與鎖 ’’’ def __init__(self, initial_value = 0): self._value = initial_value self._lock = threading.Lock() def incr(self,delta=1): ’’’ 加庫存 ’’’ with self._lock: self._value += delta def decr(self,delta=1): ’’’ 減庫存 ’’’ with self._lock: self._value -= delta

這樣看起來是不是清爽很多?

可重入鎖

上面介紹的只是最簡單的鎖,我們經常使用的往往是可重入鎖。

什么叫可重入鎖呢?簡單解釋一下,就是在一個線程已經持有了鎖的情況下,它可以再次進入被加鎖的區域。但是既然線程還持有鎖沒有釋放,那么它不應該還是在加鎖區域嗎,怎么會有需要再次進入被加鎖區域的情況呢?其實是有的,道理也很簡單,就是遞歸。

我們把上面的例子稍微改一點點,就完全不一樣了。

import threadingclass PurchaseRequest: ’’’ 初始化庫存與鎖 ’’’ def __init__(self, initial_value = 0): self._value = initial_value self._lock = threading.Lock() def incr(self,delta=1): ’’’ 加庫存 ’’’ with self._lock: self._value += delta def decr(self,delta=1): ’’’ 減庫存 ’’’ with self._lock: self.incr(-delta)

我們關注一下上面的decr方法,我們用incr來代替了原本的邏輯實現了decr。但是有一個問題是decr也是一個加鎖的方法,需要前一個鎖釋放了才能進入。但它已經持有了鎖了,那么這種情況下就會發生死鎖。

我們只需要把Lock換成可重入鎖就可以解決這個問題,只需要修改一行代碼。

import threadingclass PurchaseRequest: ’’’ 初始化庫存與鎖 我們使用RLock代替了Lock,也可重入鎖代替了普通鎖 ’’’ def __init__(self, initial_value = 0): self._value = initial_value self._lock = threading.RLock() def incr(self,delta=1): ’’’ 加庫存 ’’’ with self._lock: self._value += delta def decr(self,delta=1): ’’’ 減庫存 ’’’ with self._lock: self.incr(-delta)

總結

今天我們的文章介紹了Python當中鎖的使用方法,以及可重入鎖的概念。在并發場景下開發和調試都是一個比較困難的工作,稍微不小心就會踩到各種各樣的坑,死鎖只是其中一種比較常見并且比較容易解決的問題,除此之外還有很多其他各種各樣的問題。

針對死鎖的問題,Python還提供了其他的解決方案,我們放到下一篇文章當中再和大家分享。

以上就是淺談python并發鎖與死鎖問題的詳細內容,更多關于python并發鎖與死鎖的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: ERP企业管理系统永久免费版_在线ERP系统_OA办公_云版软件官网 | 国产离子色谱仪,红外分光测油仪,自动烟尘烟气测试仪-青岛埃仑通用科技有限公司 | BESWICK球阀,BESWICK接头,BURKERT膜片阀,美国SEL继电器-东莞市广联自动化科技有限公司 | 盘煤仪,盘料仪,盘点仪,堆料测量仪,便携式激光盘煤仪-中科航宇(北京)自动化工程技术有限公司 | 理化生实验室设备,吊装实验室设备,顶装实验室设备,实验室成套设备厂家,校园功能室设备,智慧书法教室方案 - 东莞市惠森教学设备有限公司 | 衬氟止回阀_衬氟闸阀_衬氟三通球阀_衬四氟阀门_衬氟阀门厂-浙江利尔多阀门有限公司 | 胜为光纤光缆_光纤跳线_单模尾纤_光纤收发器_ODF光纤配线架厂家直销_北京睿创胜为科技有限公司 - 北京睿创胜为科技有限公司 | 深圳3D打印服务-3D打印加工-手板模型加工厂-悟空打印坊 | 山东彩钢板房,山东彩钢活动房,临沂彩钢房-临沂市贵通钢结构工程有限公司 | 济南网站策划设计_自适应网站制作_H5企业网站搭建_济南外贸网站制作公司_锐尚 | 浙江浩盛阀门有限公司| 塑料异型材_PVC异型材_封边条生产厂家_PC灯罩_防撞扶手_医院扶手价格_东莞市怡美塑胶制品有限公司 | 汽车润滑油厂家-机油/润滑油代理-高性能机油-领驰慧润滑科技(河北)有限公司 | 深圳公司注册-工商注册公司-千百顺代理记账公司 | 品牌策划-品牌设计-济南之式传媒广告有限公司官网-提供品牌整合丨影视创意丨公关活动丨数字营销丨自媒体运营丨数字营销 | 高柔性拖链电缆-聚氨酯卷筒电缆-柔性屏蔽电缆厂家-玖泰电缆 | 考勤系统_人事考勤管理系统_本地部署BS考勤系统_考勤软件_天时考勤管理专家 | 加气混凝土砌块设备,轻质砖设备,蒸养砖设备,新型墙体设备-河南省杜甫机械制造有限公司 | 湿地保护| 蓝鹏测控平台 - 智慧车间系统 - 车间生产数据采集与分析系统 | 电动葫芦-河北悍象起重机械有限公司 | 小型高低温循环试验箱-可程式高低温湿热交变试验箱-东莞市拓德环境测试设备有限公司 | 西点培训学校_法式西点培训班_西点师培训_西点蛋糕培训-广州烘趣西点烘焙培训学院 | 哲力实业_专注汽车涂料汽车漆研发生产_汽车漆|修补油漆品牌厂家 长沙一级消防工程公司_智能化弱电_机电安装_亮化工程专业施工承包_湖南公共安全工程有限公司 | 佛山商标注册_商标注册代理|专利注册申请_商标注册公司_鸿邦知识产权 | 煤机配件厂家_刮板机配件_链轮轴组_河南双志机械设备有限公司 | 大型冰雕-景区冰雕展制作公司,3D创意设计源头厂家-[赛北冰雕] | 礼仪庆典公司,礼仪策划公司,庆典公司,演出公司,演艺公司,年会酒会,生日寿宴,动工仪式,开工仪式,奠基典礼,商务会议,竣工落成,乔迁揭牌,签约启动-东莞市开门红文化传媒有限公司 | 网络推广公司_网络营销方案策划_企业网络推广外包平台-上海澜推网络 | 明渠式紫外线杀菌器-紫外线消毒器厂家-定州市优威环保 | 深圳3D打印服务-3D打印加工-手板模型加工厂-悟空打印坊 | 纸布|钩编布|钩针布|纸草布-莱州佳源工艺纸布厂 | 东莞动力锂电池保护板_BMS智能软件保护板_锂电池主动均衡保护板-东莞市倡芯电子科技有限公司 | 硬齿面减速机[型号全],ZQ减速机-淄博久增机械 | 庭院灯_太阳能景观灯_草坪灯厂家_仿古壁灯-重庆恒投科技 | 深圳法律咨询【24小时在线】深圳律师咨询免费 | 冷却塔风机厂家_静音冷却塔风机_冷却塔电机维修更换维修-广东特菱节能空调设备有限公司 | 层流手术室净化装修-检验科ICU改造施工-华锐净化工程-特殊科室建设厂家 | 小青瓦丨古建筑瓦丨青瓦厂家-宜兴市徽派古典建筑材料有限公司 | 企业VI设计_LOGO设计公司_品牌商标设计_【北京美研】 | 美国查特CHART MVE液氮罐_查特杜瓦瓶_制造全球品质液氮罐 |