Python中線程鎖的使用介紹
前言
當(dāng)有多個(gè)線程,且它們同時(shí)訪問(wèn)同一資源時(shí),需要考慮如何避免線程沖突。解決辦法是使用線程鎖。鎖由Python的threading模塊提供,并且它最多被一個(gè)線程所持有。當(dāng)一個(gè)線程試圖獲取一個(gè)已經(jīng)鎖在資源上的鎖時(shí),該線程通常會(huì)暫停運(yùn)行,直到這個(gè)鎖被釋放。看看下面的不具備鎖功能的例子:
#!/usr/bin/env python3 # -*- coding:utf-8 -*- # Author: LiveEveryDay import threading total = 0 def update_total(amount): global total total += amount print(total) if __name__ == '__main__': for i in range(10): my_thread = threading.Thread(target=update_total, args=(5,)) my_thread.start() ''' ------ Running Results ------ 510 15 20 25 30 3540 45 50 '''
如果往以上代碼添加 time.sleep 函數(shù)并給出不同長(zhǎng)度的時(shí)間,可能會(huì)讓這個(gè)例子更有意思。無(wú)論如何,這里的問(wèn)題是,一個(gè)線程可能已經(jīng)調(diào)用 update_total 函數(shù)并且還沒(méi)有更新完成,此時(shí)另一個(gè)線程也有可能調(diào)用它并且嘗試更新內(nèi)容。根據(jù)操作執(zhí)行順序的不同,該值可能只被增加一次。
給它添加鎖后:
方式一:使用try/finally,確保鎖肯定會(huì)被釋放。
#!/usr/bin/env python3 # -*- coding:utf-8 -*- # Author: LiveEveryDay import threading total = 0 lock = threading.Lock() def update_total(amount): global total lock.acquire() try: total += amount finally: print(total) lock.release() if __name__ == '__main__': for i in range(10): my_thread = threading.Thread(target=update_total, args=(5,)) my_thread.start() ''' ------ Running Results ------ 5 10 15 20 25 30 35 40 45 50 '''
如上,在我們做任何處理之前就獲取鎖。然后嘗試更新 total 的值,最后打印出 total 的當(dāng)前值并釋放鎖。
方式二:with語(yǔ)句避免使用try/finally。
事實(shí)上,我們可以使用 Python 的 with 語(yǔ)句避免使用 try/finally 這種較為繁瑣的語(yǔ)句:
#!/usr/bin/env python3 # -*- coding:utf-8 -*- # Author: LiveEveryDay import threading total = 0 lock = threading.Lock() def update_total(amount): global total with lock: total += amount print(total) if __name__ == '__main__': for i in range(10): my_thread = threading.Thread(target=update_total, args=(5,)) my_thread.start() ''' ------ Running Results ------ 5 10 15 20 25 30 35 40 45 50 '''
總結(jié)
到此這篇關(guān)于Python中線程鎖的使用介紹的文章就介紹到這了,更多相關(guān)Python線程鎖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
利用Python語(yǔ)言的grpc實(shí)現(xiàn)消息傳送詳解
gRPC是一個(gè)高性能、通用的開(kāi)源RPC框架,其由Google主要面向移動(dòng)應(yīng)用開(kāi)發(fā)并基于HTTP/2協(xié)議標(biāo)準(zhǔn)而設(shè)計(jì)。本文主要介紹了如何利用Python語(yǔ)言的grpc實(shí)現(xiàn)消息傳送,感興趣的可以了解一下2023-03-03pytorch中的torch.nn.Conv2d()函數(shù)圖文詳解
這篇文章主要給大家介紹了關(guān)于pytorch中torch.nn.Conv2d()函數(shù)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-02-02Python發(fā)送郵件測(cè)試報(bào)告操作實(shí)例詳解
這篇文章主要介紹了Python發(fā)送郵件測(cè)試報(bào)告操作,結(jié)合實(shí)例形式較為詳細(xì)的分析了Python郵件發(fā)送相關(guān)模塊使用及操作注意事項(xiàng),需要的朋友可以參考下2018-12-12解決Scrapy安裝錯(cuò)誤:Microsoft Visual C++ 14.0 is required...
下面小編就為大家?guī)?lái)一篇解決Scrapy安裝錯(cuò)誤:Microsoft Visual C++ 14.0 is required...的問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10兩個(gè)命令把 Vim 打造成 Python IDE的方法
這篇文章主要介紹了兩個(gè)命令把 Vim 打造成 Python IDE,需要的朋友可以參考下2016-03-03解決windows上安裝tensorflow時(shí)報(bào)錯(cuò),“DLL load failed: 找不到指定的模塊”的問(wèn)題
這篇文章主要介紹了解決windows上安裝tensorflow時(shí)報(bào)錯(cuò),“DLL load failed: 找不到指定的模塊”的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05詳談Python高階函數(shù)與函數(shù)裝飾器(推薦)
下面小編就為大家?guī)?lái)一篇詳談Python高階函數(shù)與函數(shù)裝飾器(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09python?裝飾器(Decorators)原理說(shuō)明及操作代碼
裝飾器(Decorators)是 Python 的一個(gè)重要部分,本文由淺入深給大家介紹了python?裝飾器Decorators原理,感興趣的朋友跟隨小編一起看看吧2021-12-12