詳解Python中的Lock和Rlock
線程是進(jìn)程中可以調(diào)度執(zhí)行的實(shí)體。而且,它是操作系統(tǒng)中可以執(zhí)行的最小處理單元。簡(jiǎn)單地說(shuō),一個(gè)線程就是一個(gè)程序中可以獨(dú)立于其他代碼執(zhí)行的指令序列。為了簡(jiǎn)單起見(jiàn),你可以假設(shè)線程只是進(jìn)程的子集!
Locks
鎖是Python中用于同步的最簡(jiǎn)單的方式。鎖有兩種狀態(tài):上鎖、釋放鎖。
鎖是線程模塊中的一個(gè)類,有兩個(gè)主要方法:acquire()和release() 當(dāng)調(diào)用acquire()方法時(shí),它鎖定鎖的執(zhí)行并阻塞鎖的執(zhí)行,直到其他線程調(diào)用release()方法將其設(shè)置為解鎖狀態(tài)。鎖幫助我們有效地訪問(wèn)程序中的共享資源,以防止數(shù)據(jù)損壞,它遵循互斥,因?yàn)橐淮沃荒苡幸粋€(gè)線程訪問(wèn)特定的資源。
讓我們看看下面的例子來(lái)理解鎖的使用:
import threading #創(chuàng)建一個(gè)lock對(duì)象 lock = threading.Lock() #初始化共享資源 abce = 0 def sumOne(): global abce #鎖定共享資源 lock.acquire() abce = abce + 1 #釋放共享資源 lock.release() def sumTwo(): global abce #鎖定共享資源 lock.acquire() abce = abce + 2 #釋放共享資源 lock.release() #調(diào)用函數(shù) sumOne() sumTwo() print(abce)
在上面的程序中,lock是一個(gè)鎖對(duì)象,全局變量abce是一個(gè)共享資源,sumOne()和sumTwo()函數(shù)扮作兩個(gè)線程,在sumOne()函數(shù)中共享資源abce首先被鎖定,然后增加了1,然后abce被釋放。sumTwo()函數(shù)執(zhí)行類似操作。 兩個(gè)函數(shù)sumOne()和sumTwo()不能同時(shí)訪問(wèn)共享資源abce,一次只能一個(gè)訪問(wèn)共享資源。
RLocks
默認(rèn)的lock不能識(shí)別lock當(dāng)前被哪個(gè)線程持有。如果任何線程正在訪問(wèn)共享資源,那么試圖訪問(wèn)共享資源的其他線程將被阻塞,即使鎖定共享資源的線程也是如此。 在這些情況下,可重入鎖(或RLock)用于防止訪問(wèn)共享資源時(shí)出現(xiàn)不必要的阻塞。如果共享資源在RLock中,那么可以安全地再次調(diào)用它。 RLocked資源可以被不同的線程重復(fù)訪問(wèn),即使它在被不同的線程調(diào)用時(shí)仍然可以正常工作。
讓我們看看下面的例子來(lái)理解RLocks的使用:
import threading #創(chuàng)建一個(gè)lock對(duì)象 lock = threading.Lock() #初始化共享資源 abce = 0 #本線程訪問(wèn)共享資源 lock.acquire() abce = abce + 1 #這個(gè)線程訪問(wèn)共享資源會(huì)被阻塞 lock.acquire() abce = abce + 2 lock.release() print(abce)
在上面的程序中,兩個(gè)線程同時(shí)嘗試訪問(wèn)共享資源abce,這里當(dāng)一個(gè)線程當(dāng)前正在訪問(wèn)共享資源abce時(shí),另一個(gè)線程將被阻止訪問(wèn)它。 當(dāng)兩個(gè)或多個(gè)線程試圖訪問(wèn)相同的資源時(shí),有效地阻止了彼此訪問(wèn)該資源,這就是所謂的死鎖,因此上述程序沒(méi)有生成任何輸出。
但是,在程序中上述問(wèn)題可以通過(guò)使用RLock來(lái)解決。
import threading #創(chuàng)建一個(gè)rlock對(duì)象 lock = threading.RLock() #初始化共享資源 abce = 0 #本線程訪問(wèn)共享資源 lock.acquire() abce = abce + 1 #這個(gè)線程嘗試訪問(wèn)共享資源 lock.acquire() abce = abce + 2 lock.release() print(abce)
在這里,沒(méi)有阻止程序中的線程訪問(wèn)共享資源abce。 對(duì)于RLock對(duì)象鎖的每個(gè)acquire(),我們需要調(diào)用release()一次。
從上面提到的眾多程序和解釋中,在Python中一個(gè)Lock對(duì)象和一個(gè)RLock對(duì)象有很多區(qū)別:
locks | rlocks |
---|---|
lock對(duì)象無(wú)法再被其他線程獲取,除非持有線程釋放 | rlock對(duì)象可以被其他線程多次獲取 |
lock對(duì)象可被任何線程釋放 | rlock對(duì)象只能被持有的線程釋放 |
lock對(duì)象不可以被任何線程擁有 | rlock對(duì)象可以被多個(gè)線程擁有 |
對(duì)一個(gè)對(duì)象鎖定是很快的 | 對(duì)一個(gè)對(duì)象加rlock比加lock慢 |
以上就是詳解Python中的Lock和Rlock的詳細(xì)內(nèi)容,更多關(guān)于Python中Lock和Rlock的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python跨文件夾調(diào)用別的文件夾下py文件或參數(shù)方式詳解
這篇文章主要給大家介紹了關(guān)于python跨文件夾調(diào)用別的文件夾下py文件或參數(shù)方式的相關(guān)資料,在python中有時(shí)候我們需要調(diào)用另一.py文件中的方法或者類,需要的朋友可以參考下2023-08-08解決pip install xxx報(bào)錯(cuò)SyntaxError: invalid syntax的問(wèn)題
今天小編就為大家分享一篇解決pip install xxx報(bào)錯(cuò)SyntaxError: invalid syntax的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-11-11Python MySQLdb 使用utf-8 編碼插入中文數(shù)據(jù)問(wèn)題
這篇文章主要介紹了Python MySQLdb 使用utf-8 編碼插入中文數(shù)據(jù)問(wèn)題,需要的朋友可以參考下2018-03-03Python matplotlib的使用并自定義colormap的方法
今天小編就為大家分享一篇Python matplotlib的使用并自定義colormap的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12Python信息處理庫(kù)Talon自動(dòng)抽取簽名信息
這篇文章主要為大家介紹了Python信息處理庫(kù)Talon自動(dòng)抽取簽名信息實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01在Python中Dataframe通過(guò)print輸出多行時(shí)顯示省略號(hào)的實(shí)例
今天小編就為大家分享一篇在Python中Dataframe通過(guò)print輸出多行時(shí)顯示省略號(hào)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12python數(shù)組排序方法之sort、sorted和argsort詳解
這篇文章主要給大家介紹了關(guān)于python數(shù)組排序方法之sort、sorted和argsort的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-03-03