亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python多線程死鎖現(xiàn)象及解決方法

 更新時(shí)間:2022年07月01日 11:48:49   作者:程序媛_lisa  
這篇文章主要為大家介紹了python多線程死鎖現(xiàn)象與解決方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

本節(jié)重點(diǎn)

了解死鎖現(xiàn)象與解決方法

本節(jié)時(shí)長(zhǎng)需控制在15分鐘內(nèi)

一 死鎖現(xiàn)象

所謂死鎖: 是指兩個(gè)或兩個(gè)以上的進(jìn)程或線程在執(zhí)行過(guò)程中,因爭(zhēng)奪資源而造成的一種互相等待的現(xiàn)象,若無(wú)外力作用,它們都將無(wú)法推進(jìn)下去。

此時(shí)稱(chēng)系統(tǒng)處于死鎖狀態(tài)或系統(tǒng)產(chǎn)生了死鎖,這些永遠(yuǎn)在互相等待的進(jìn)程稱(chēng)為死鎖進(jìn)程,如下就是死鎖

from threading import Thread,Lock
import time
mutexA=Lock()
mutexB=Lock()
class MyThread(Thread):
    def run(self):
        self.func1()
        self.func2()
    def func1(self):
        mutexA.acquire()
        print('\033[41m%s 拿到A鎖\033[0m' %self.name)
        mutexB.acquire()
        print('\033[42m%s 拿到B鎖\033[0m' %self.name)
        mutexB.release()
        mutexA.release()
    def func2(self):
        mutexB.acquire()
        print('\033[43m%s 拿到B鎖\033[0m' %self.name)
        time.sleep(2)
        mutexA.acquire()
        print('\033[44m%s 拿到A鎖\033[0m' %self.name)
        mutexA.release()
        mutexB.release()
if __name__ == '__main__':
    for i in range(10):
        t=MyThread()
        t.start()

執(zhí)行效果

Thread-1 拿到A鎖
Thread-1 拿到B鎖
Thread-1 拿到B鎖
Thread-2 拿到A鎖 #出現(xiàn)死鎖,整個(gè)程序阻塞住

二 遞歸鎖

解決方法,遞歸鎖,在Python中為了支持在同一線程中多次請(qǐng)求同一資源,python提供了可重入鎖RLock。

這個(gè)RLock內(nèi)部維護(hù)著一個(gè)Lock和一個(gè)counter變量,counter記錄了acquire的次數(shù),從而使得資源可以被多次require。直到一個(gè)線程所有的acquire都被release,其他的線程才能獲得資源。

上面的例子如果使用RLock代替Lock,則不會(huì)發(fā)生死鎖,二者的區(qū)別是:遞歸鎖可以連續(xù)acquire多次,而互斥鎖只能acquire一次

from threading import Thread,RLock
import time
mutexA=mutexB=RLock() #一個(gè)線程拿到鎖,counter加1,該線程內(nèi)又碰到加鎖的情況,則counter繼續(xù)加1,這期間所有其他線程都只能等待,等待該線程釋放所有鎖,即counter遞減到0為止
class MyThread(Thread):
    def run(self):
        self.func1()
        self.func2()
    def func1(self):
        mutexA.acquire()
        print('\033[41m%s 拿到A鎖\033[0m' %self.name)
        mutexB.acquire()
        print('\033[42m%s 拿到B鎖\033[0m' %self.name)
        mutexB.release()
        mutexA.release()
    def func2(self):
        mutexB.acquire()
        print('\033[43m%s 拿到B鎖\033[0m' %self.name)
        time.sleep(2)
        mutexA.acquire()
        print('\033[44m%s 拿到A鎖\033[0m' %self.name)
        mutexA.release()
        mutexB.release()
if __name__ == '__main__':
    for i in range(10):
        t=MyThread()
        t.start()

以上就是python多線程死鎖現(xiàn)象與解決方法的詳細(xì)內(nèi)容,更多關(guān)于python多線程死鎖現(xiàn)象解決的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • PyQt5 QThread倒計(jì)時(shí)功能的實(shí)現(xiàn)代碼

    PyQt5 QThread倒計(jì)時(shí)功能的實(shí)現(xiàn)代碼

    這篇文章主要介紹了PyQt5 QThread倒計(jì)時(shí)功能的實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • python 使用shutil復(fù)制圖片的例子

    python 使用shutil復(fù)制圖片的例子

    今天小編就為大家分享一篇python 使用shutil復(fù)制圖片的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • pandas添加新列的5種常見(jiàn)方法

    pandas添加新列的5種常見(jiàn)方法

    pandas為DataFrame格式數(shù)據(jù)添加新列的方法非常簡(jiǎn)單,下面這篇文章主要給大家介紹了關(guān)于pandas添加新列的5種常見(jiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • python3 中的幾種除法介紹,小數(shù)的不同顯示

    python3 中的幾種除法介紹,小數(shù)的不同顯示

    這篇文章主要介紹了python3 中的幾種除法介紹,小數(shù)的不同顯示,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-03-03
  • LyScript尋找ROP漏洞指令片段的方法詳解

    LyScript尋找ROP漏洞指令片段的方法詳解

    ROP可以理解成一個(gè)可以關(guān)閉系統(tǒng)自身內(nèi)存保護(hù)的一段機(jī)器指令。本文將利用LyScript尋找ROP漏洞指令片段,感興趣的小伙伴可以了解一下
    2022-07-07
  • python二分法查找實(shí)例代碼

    python二分法查找實(shí)例代碼

    二分算法是一種效率比較高的查找算法,其輸入的是一個(gè)有序的元素列表,如果查找元素包含在列表中,二分查找返回其位置,否則返回NONE,下面這篇文章主要給大家介紹了關(guān)于python二分法查找的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • python實(shí)現(xiàn)獲取電腦所連接的wifi密碼

    python實(shí)現(xiàn)獲取電腦所連接的wifi密碼

    電腦連接wifi后,很難直觀地看到當(dāng)前連接wifi的密碼,需要借助命令行公管局才可以查看到相關(guān)信息,本文為大家介紹一下如何利用python獲取電腦所連接的wifi密碼,感興趣的可以了解下
    2023-11-11
  • python刪除指定列或多列單個(gè)或多個(gè)內(nèi)容實(shí)例

    python刪除指定列或多列單個(gè)或多個(gè)內(nèi)容實(shí)例

    這篇文章主要介紹了python刪除指定列或多列單個(gè)或多個(gè)內(nèi)容實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-06-06
  • Python微信庫(kù):itchat的用法詳解

    Python微信庫(kù):itchat的用法詳解

    本篇文章主要介紹了Python微信庫(kù):itchat的用法詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • python的常見(jiàn)命令注入威脅

    python的常見(jiàn)命令注入威脅

    不過(guò)下面可是我們開(kāi)發(fā)產(chǎn)品初期的一些血淋淋的案例,更多的安全威脅可以看看北北同學(xué)的《python hack》PPT,里面提及了不只命令執(zhí)行的威脅,那些都是我們親身經(jīng)歷的代碼
    2013-02-02

最新評(píng)論