這篇文章給大家分享的是有關(guān)python鎖與死鎖的案例分析的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考。一起跟隨小編過來看看吧。

如果你學(xué)過操作系統(tǒng),那么對(duì)于鎖應(yīng)該不陌生。鎖的含義是線程鎖,可以用來指定某一個(gè)邏輯或者是資源同一時(shí)刻只能有一個(gè)線程訪問。這個(gè)很好理解,就好像是有一個(gè)房間被一把鎖鎖住了,只有拿到鑰匙的人才能進(jìn)入。每一個(gè)人從房間門口拿到鑰匙進(jìn)入房間,出房間的時(shí)候會(huì)把鑰匙再放回到門口。這樣下一個(gè)到門口的人就可以拿到鑰匙了。這里的房間就是某一個(gè)資源或者是一段邏輯,而拿取鑰匙的人其實(shí)指的是一個(gè)線程。
加鎖的原因
我們明白了鎖的原理,不禁有了一個(gè)問題,我們?yōu)槭裁葱枰i呢,它在哪些場(chǎng)景當(dāng)中會(huì)用到呢?
其實(shí)它的使用場(chǎng)景非常廣,我們舉一個(gè)非常簡(jiǎn)單的例子,就是淘寶買東西。我們都知道商家的庫存都是有限的,賣掉一個(gè)少一個(gè)。假如說當(dāng)前某個(gè)商品庫存只剩下一個(gè),但當(dāng)下卻有兩個(gè)人同時(shí)購買。兩個(gè)人同時(shí)購買也就是有兩個(gè)請(qǐng)求同時(shí)發(fā)起購買請(qǐng)求,如果我們不加鎖的話,兩個(gè)線程同時(shí)查詢到商品的庫存是1,大于0,進(jìn)行購買邏輯之后,減一。由于兩個(gè)線程同時(shí)執(zhí)行,所以最后商品的庫存會(huì)變成-1。
顯然商品的庫存不應(yīng)該是一個(gè)負(fù)數(shù),所以我們需要避免這種情況發(fā)生。通過加鎖可以完美解決這個(gè)問題。我們規(guī)定一次只能有一個(gè)線程發(fā)起購買的請(qǐng)求,那么這樣當(dāng)一個(gè)線程將庫存減到0的時(shí)候,第二個(gè)請(qǐng)求就無法修改了,就保證了數(shù)據(jù)的準(zhǔn)確性。
代碼實(shí)現(xiàn)
那么在Python當(dāng)中,我們?cè)趺礃觼韺?shí)現(xiàn)這個(gè)鎖呢?
其實(shí)很簡(jiǎn)單,threading庫當(dāng)中已經(jīng)為我們提供了線程的工具,我們直接拿過來用就可以了。我們通過使用threading當(dāng)中的Lock對(duì)象, 可以很輕易的實(shí)現(xiàn)方法加鎖的功能。
import threading
class 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()
網(wǎng)站標(biāo)題:python鎖與死鎖的案例分析-創(chuàng)新互聯(lián)
分享地址:http://chinadenli.net/article10/cogcgo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、App開發(fā)、云服務(wù)器、微信小程序、企業(yè)網(wǎng)站制作、外貿(mào)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容