Python并發編程:多線程-死鎖現象與遞歸鎖

一  死鎖現象

  所謂死鎖:是指兩個或兩個以上的進程或線程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處于死鎖狀態或系統產生了死鎖,這些永遠在互相等待的進程稱為死鎖進程,如下就是死鎖

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

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(3)

????????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()

  執行效果

1

2

3

4

Thread-1?拿到A鎖

Thread-1?拿到B鎖

Thread-1?拿到B鎖

Thread-2?拿到A鎖????????# 出現死鎖,整個程序阻塞

  

二 遞歸鎖

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

這個RLock內部維護著一個Lock和一個counter變量,counter記錄了acquire的次數,從而使得資源可以被多次require。直到一個線程所有的acquire都被release,其它的線程才能獲得資源。上面的例子如果使用RLock代替Lock,則不會發生死鎖,二者的區別是:遞歸鎖可以連續acquire多次,而互斥鎖只能acquire一次

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

# 遞歸鎖

from?threading?import?Thread, RLock

import?time

mutexA?=?mutexB?=?RLock()???????# 一個線程拿到鎖,counter加1,該線程內又碰到加鎖的情況,則counter繼續加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('%s 拿到B鎖'?%?self.name)

????????mutexB.release()

????????mutexA.release()

????def?func2(self):

????????mutexB.acquire()

????????print('\033[43m%s 拿到B鎖\033[0m'?%?self.name)

????????mutexA.acquire()

????????print('%s 拿到A鎖'?%?self.name)

????????mutexA.release()

????????mutexB.release()

if?__name__?==?'__main__':

????for?i?in?range(10):

????????t?=?MyThread()

????????t.start()

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/713670.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/713670.shtml
英文地址,請注明出處:http://en.pswp.cn/news/713670.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

持安科技孫維伯:零信任在攻防演練下的最佳實踐|DISCConf 2023

近日,在2023數字身份安全技術大會上,持安科技聯合創始人孫維伯應主辦方的特別邀請,發表了主題為“零信任在攻防演練下的最佳實踐”的演講。 孫維伯在2023數字身份安全技術大會上發表演講 以下為本次演講實錄: 我是持安科技的聯合…

【c++】 STL的組件簡介與容器的使用時機

STL六大組件簡介 STL提供了六大組件,彼此之間可以組合套用,這六大組件分別是:容器、算法、迭代器、仿函數、適配器(配接器)、空間配置器。 容器:各種數據結構,如vector、list、deque、set、map等,用來存放…

微信云開發-- Mac安裝 wx-server-sdk依賴

第一次上傳部署云函數時,會提示安裝依賴wx-server-sdk 一. 判斷是否安裝wx-server-sdk依賴 先創建一個云函數,然后檢查云函數目錄。 如果云函數目錄下只顯示如下圖所示三個文件,說明未安裝依賴。 如果云函數目錄下顯示如下圖所示四個文件&a…

EdgeX Foundry 邊緣物聯網中間件平臺

文章目錄 1.EdgeX Foundry2.平臺架構3.平臺服務3.1.設備服務3.2.核心服務3.3.支持服務3.4.應用服務3.5.安全服務3.6.管理服務 EdgeX Foundry # EdgeX Foundryhttps://iothub.org.cn/docs/edgex/ https://iothub.org.cn/docs/edgex/edgex-foundry/1.EdgeX Foundry EdgeX Found…

Linux下設置網關以及網絡相關命令

在Linux下設置網關以及進行網絡相關的操作,通常需要使用一系列的命令。以下是一些常用的命令和步驟: 查看網絡接口信息 ifconfig:用于查看網絡接口的狀態和配置信息(已淘汰)。ip link:顯示本地的鏈路層設…

嵌入式 Linux 下的 LVGL 移植

目錄 準備創建工程修改配置修改 lv_drv_conf.h修改 lv_conf.h修改 main.c修改 Makefile 編譯運行更多內容 LVGL(Light and Versatile Graphics Library)是一個輕量化的、開源的、在嵌入式系統中廣泛使用的圖形庫,它提供了一套豐富的控件和組件…

ConfigurableBeanFactory學習

簡介 ConfigurableBeanFactory定義BeanFactory的配置。ConfigurableBeanFactory中定義了太多太多的api,比如類加載器,類型轉化,屬性編輯器,BeanPostProcessor,作用域,bean定義,處理bean依賴關系,合并其他ConfigurableBeanFactory,bean如何銷毀。ConfigurableBeanFactory同時繼…

微軟為金融界帶來革命性突破——推出Microsoft 365中的下一代AI助手:Microsoft Copilot for Finance

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎?訂閱我們的簡報,深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同,從行業內部的深度分析和實用指南中受益。不要錯過這個機會,成為AI領…

雷龍CS SD NAND(貼片式TF卡)測評體驗

前段時間有幸免費得到了雷龍出品的貼片式的TF卡的芯片及轉接板,兩片貼片式nand芯片+一個轉接板,一種一個已讓官方焊接完好;如下圖所示: 正面: 背面: 通過轉接板,可以將CS SD NAND(貼…

數電實驗之流水燈、序列發生器

最近又用到了數電實驗設計的一些操作和設計思想,遂整理之。 廣告流水燈 實驗內容 用觸發器、組合函數器件和門電路設計一個廣告流水燈,該流水燈由 8 個 LED 組成,工作時始終為 1 暗 7 亮,且這一個暗燈循環右移。 1) 寫出設計過…

關于DisableIEToEdge插件閃退問題的解決方案

關于DisableIEToEdge插件閃退問題.今天終于測試找到最佳解決方案了! 1.管理員權限運行Windows powershell. 2.執行一下兩條命令修復系統環境 DISM.exe /Online /Cleanup-image /Restorehealth sfc /scannow 3.關閉Windows安全中心的所有安全選項。 4.管理員權限運行…

【計算機考研擇校】四川大學vs電子科技大學哪個難度更大?

川大在文科,經管方面比科大強,醫學在國內都很強。但工科方面特別是電子信息領域明顯是科大強于川大。畢竟一個是綜合大學,一個是工科大學不可同日而語。 就業上,電子科大在IT領域的社會聲譽口碑不錯。就業一向都很好。這個多問問…

.datastore@cyberfear.com.mkp勒索病毒的最新威脅:如何恢復您的數據?

導言: 我們享受著數字化帶來的便利,但同時也要面對不斷演進的網絡威脅。最近出現的 .datastorecyberfear.com.mkp、[hendersoncock.li].mkp [hudsonLcock.li]、.mkp [myersairmail.cc].mkp 勒索病毒就是其中之一,它對我們的數據安全構成了…

張俊將出席用磁懸浮技術改變生活演講

演講嘉賓:張俊 空壓機銷售總監 億昇(天津)科技有限公司 演講題目:用磁懸浮技術改變生活 會議簡介 “十四五”規劃中提出,提高工業、能源領城智能化與信息化融合,明確“低碳經濟”新的戰略目標,熱能產業是能源產業和…

Python環境下一種改進的基于梯度下降的自適應短時傅里葉變換

在數字信號處理技術中,傅里葉變換及其逆變換是一種信號時頻分析方法。該方法將信號的時域描述及頻域描述聯系在一起,時域信號可通過正變換轉變為頻域信號,頻域信號可通過逆變換轉變為時域信號進行分析。但傅里葉變換及其逆變換是一種信號的整…

Linux/Centos 部署靜態IP,解決無法訪問目標主機、Destination Host Unreachable、無法ping通互聯網的問題

Linux/Centos 部署IP,解決無法訪問目標主機、Destination Host Unreachable、無法ping通互聯網的問題 Linux/Centos 部署靜態IP查物理機/自身電腦的IP設置VMware上的虛擬網絡編輯器設置網卡IP,激活至此就可訪問百度了 Linux/Centos 部署靜態IP 需要注意…

軟考基礎知識2

1.DMA控制方式:直接內存存取。數據在內存與I/O設備間直接成塊傳送,不需要CPU的任何干涉,由DMA硬件直接執行完成。 例題: 2.程序計數器總是存下一個指令的地址。 例題: 3.可靠度的計算: 例題&#xff1a…

吸貓毛空氣凈化器哪個好?推薦除貓毛效果好寵物空氣凈化器品牌

當下有越來越多的家庭選擇養寵物!盡管家里變得更加溫馨,但養寵可能會帶來異味和空氣中的毛發增多可能會帶來健康問題,這是一個大問題! 不想家里彌漫著異味,特別是來自寵物便便的味道,所以需要一款能夠處理…

大語言模型LLM Pro+中Pro+(Prompting)的意義

—— Pro ,即Prompting,構造提示 1.LLM Pro中Pro(Prompting)的意義 Prompting不僅是大語言模型交互和調用的一種高效手段,而且已成為推動模型泛化能力和應用靈活性的關鍵技術路徑,它不僅極大地拓展了模型功…

ABAP - SALV教程02 - 開篇:打開SALV的三種方式之二

全屏模式生成SALV的方式:http://t.csdnimg.cn/CzNLz本文講解生成可控模式的SALV,該方式需要依賴自己創建屏幕的自定義控件區域(Custom Control)實現步驟:需要注意的點是SALV的實例對象和dispaly方法一定是在屏幕PBO事件…