欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

本節(jié)重點

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

本節(jié)時長需控制在15分鐘內(nèi)

一 死鎖現(xiàn)象

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

此時稱系統(tǒng)處于死鎖狀態(tài)或系統(tǒng)產(chǎ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)死鎖,整個程序阻塞住

二 遞歸鎖

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

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

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

from threading import Thread,RLock
import time
mutexA=mutexB=RLock() #一個線程拿到鎖,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)象與解決方法的詳細內(nèi)容,更多關(guān)于python多線程死鎖現(xiàn)象解決的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

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

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

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

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

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

    pandas添加新列的5種常見方法

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

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

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

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

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

    python二分法查找實例代碼

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

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

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

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

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

    Python微信庫:itchat的用法詳解

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

    python的常見命令注入威脅

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

最新評論