對(duì)python多線(xiàn)程中Lock()與RLock()鎖詳解
資源總是有限的,程序運(yùn)行如果對(duì)同一個(gè)對(duì)象進(jìn)行操作,則有可能造成資源的爭(zhēng)用,甚至導(dǎo)致死鎖
也可能導(dǎo)致讀寫(xiě)混亂
鎖提供如下方法:
1.Lock.acquire([blocking])
2.Lock.release()
3.threading.Lock() 加載線(xiàn)程的鎖對(duì)象,是一個(gè)基本的鎖對(duì)象,一次只能一個(gè)鎖定,其余鎖請(qǐng)求,需等待鎖釋放后才能獲取
4.threading.RLock() 多重鎖,在同一線(xiàn)程中可用被多次acquire。如果使用RLock,那么acquire和release必須成對(duì)出現(xiàn),
調(diào)用了n次acquire鎖請(qǐng)求,則必須調(diào)用n次的release才能在線(xiàn)程中釋放鎖對(duì)象
例如:
無(wú)鎖:
#coding=utf8 import threading import time num = 0 def sum_num(i): global num time.sleep(1) num +=i print num print '%s thread start!'%(time.ctime()) try: for i in range(6): t =threading.Thread(target=sum_num,args=(i,)) t.start() except KeyboardInterrupt,e: print "you stop the threading" print '%s thread end!'%(time.ctime())
輸出:
Sun May 28 20:54:59 2017 thread start! Sun May 28 20:54:59 2017 thread end! 01 3 710 15
結(jié)果顯示混亂
引入鎖:
#coding=utf8 import threading import time num = 0 def sum_num(i): lock.acquire() global num time.sleep(1) num +=i print num lock.release() print '%s thread start!'%(time.ctime()) try: lock=threading.Lock() list = [] for i in range(6): t =threading.Thread(target=sum_num,args=(i,)) list.append(t) t.start() for threadinglist in list: threadinglist.join() except KeyboardInterrupt,e: print "you stop the threading" print '%s thread end!'%(time.ctime())
結(jié)果:
Sun May 28 21:15:37 2017 thread start! 0 1 3 6 10 15 Sun May 28 21:15:43 2017 thread end!
其中:
lock=threading.Lock()加載鎖的方法也可以換成lock=threading.RLock()
如果將上面的sum_num修改為:
lock.acquire() global num lock.acquire() time.sleep(1) num +=i lock.release() print num lock.release()
那么:
lock=threading.Lock() 加載的鎖,則一直處于等待中,鎖等待
而lock=threading.RLock() 運(yùn)行正常
以上這篇對(duì)python多線(xiàn)程中Lock()與RLock()鎖詳解就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python中time模塊的幾個(gè)時(shí)間轉(zhuǎn)化方式
這篇文章主要介紹了python中time模塊的幾個(gè)時(shí)間轉(zhuǎn)化方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08Python快速轉(zhuǎn)換numpy數(shù)組中Nan和Inf的方法實(shí)例說(shuō)明
今天小編就為大家分享一篇關(guān)于Python快速轉(zhuǎn)換numpy數(shù)組中Nan和Inf的方法實(shí)例說(shuō)明,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02python讀取并顯示圖片的三種方法(opencv、matplotlib、PIL庫(kù))
這篇文章主要給大家介紹了關(guān)于python讀取并顯示圖片的三種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04django組合搜索實(shí)現(xiàn)過(guò)程詳解(附代碼)
這篇文章主要介紹了django組合搜索實(shí)現(xiàn)過(guò)程詳解(附代碼),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08詳解Python如何實(shí)現(xiàn)惰性導(dǎo)入-lazy import
如果你的 Python 程序程序有大量的 import,而且啟動(dòng)非常慢,那么你應(yīng)該嘗試懶導(dǎo)入,本文分享一種實(shí)現(xiàn)惰性導(dǎo)入的一種方法,需要的可以參考一下2022-10-10Python實(shí)現(xiàn)UDP與TCP通信的示例詳解
UDP是一種無(wú)連接的、不可靠的傳輸協(xié)議;TCP是一種可靠的、面向連接的傳輸協(xié)議。這篇文章主要介紹了Python實(shí)現(xiàn)UDP與TCP通信的方法,需要的可以參考一下2023-03-03pycharm 使用心得(九)解決No Python interpreter selected的問(wèn)題
PyCharm 是由JetBrains打造的一款 Python IDE。具有智能代碼編輯器,能理解 Python 的特性并提供卓越的生產(chǎn)力推進(jìn)工具:自動(dòng)代碼格式化、代碼完成、重構(gòu)、自動(dòng)導(dǎo)入和一鍵代碼導(dǎo)航等。這些功能在先進(jìn)代碼分析程序的支持下,使 PyCharm 成為 Python 專(zhuān)業(yè)開(kāi)發(fā)人員和剛起步人員使用的有力工具。2014-06-06