學習筆記(28):Python網絡編程并發編程-死鎖與遞歸鎖

立即學習:https://edu.csdn.net/course/play/24458/296445?utm_source=blogtoedu

1.死鎖(Lock()的局限性)

知識點:Lock()只能被獲得(acquire)一次,要想再次獲得必須釋放后才能獲得

?

1)死鎖情況1

#死鎖情況1
from threading import Thread,Lock
import time
#設置了兩把互斥鎖
mutexA = Lock()
mutexB = Lock()class mythread(Thread):def run(self):self.f1()self.f2()def f1(self):#首先線程1獲得了A鎖,再獲得B鎖,最后兩個都釋放,開始進行f2中的B鎖,因為沉睡了0.1秒,足以讓線程2獲得f1中的A鎖,接下來線程1的工作是沉睡結束后獲得A鎖,線程2準備獲得B鎖,一直處于等待鎖的釋放,因為線程1和線程2都是在等待彼此手中的那把鎖,因此形成了死鎖mutexA.acquire()print('%s獲取到了A鎖'%self.name)mutexB.acquire()print('%s獲取到了B鎖'%self.name)mutexB.release()mutexA.release()def f2(self):mutexB.acquire()print('%s獲取到了B鎖'%self.name)time.sleep(0.1)mutexA.acquire()print('%s獲取到了A鎖'%self.name)mutexA.release()mutexB.release()if __name__ == '__main__':#線程切換的速度非常快,因此可以看成是依次線程執行的for i in range(10):t = mythread()t.start()

?

2)死鎖情況2

#死鎖情況2
from threading import Thread,Lock
import time
#設置了兩把互斥鎖,且是同一把鎖
mutexA = mutexB = Lock()class mythread(Thread):def run(self):self.f1()def f1(self):#首先線程1獲得了A鎖,再獲得B鎖,最后兩個都釋放,開始進行f2中的B鎖,因為沉睡了0.1秒,足以讓線程2獲得f1中的A鎖,接下來線程1的工作是沉睡結束后獲得A鎖,線程2準備獲得B鎖,一直處于等待鎖的釋放,因為線程1和線程2都是在等待彼此手中的那把鎖,因此形成了死鎖mutexA.acquire()print('%s獲取到了A鎖'%self.name)mutexB.acquire()print('%s獲取到了B鎖'%self.name)mutexB.release()mutexA.release()if __name__ == '__main__':#線程切換的速度非常快,因此可以看成是依次線程執行的for i in range(10):t = mythread()t.start()

?

2.遞歸鎖(RLock):可以解決死鎖的問題

知識點:RLock(),

1)支持被同一個線程連續多次被獲取(acquire),

2)內置一個計數器,同一線程每acquire一次,計數器+1,每release·一次,計數器-1,一直到計數器歸零,這把遞歸鎖才能被其他線程獲取(acquire)

#遞歸鎖情況
from threading import Thread,RLock
import time
#設置了兩把互斥鎖
mutexA = mutexB = RLock()class mythread(Thread):def run(self):self.f1()self.f2()def f1(self):#首先線程1獲得了A鎖計數器+1為1,再獲得B鎖計數器+1為2,最后兩個都釋放計數器歸零,鎖可以被其他線程獲取,因為線程速度快,所以線程1獲取到了f2的B鎖,計數器為1,因為沉睡了0.1秒且線程1的計數器為1,雖然足以讓線程2去獲得f1中的A鎖,但是條件不允許啊(計數器不歸零),接下來線程1的工作是沉睡結束后獲得A鎖,計數器為2,線程1釋放兩次后計數器為0,線程2立馬獲得鎖,不一定是線程2獲得mutexA.acquire()print('%s獲取到了A鎖'%self.name)mutexB.acquire()print('%s獲取到了B鎖'%self.name)mutexB.release()mutexA.release()def f2(self):mutexB.acquire()print('%s獲取到了B鎖'%self.name)time.sleep(0.1)mutexA.acquire()print('%s獲取到了A鎖'%self.name)mutexA.release()mutexB.release()if __name__ == '__main__':#線程切換的速度非常快,因此可以看成是依次線程執行的for i in range(10):t = mythread()t.start()
#運行結果
'''
"F:\software install\python3.6.4\python.exe" C:/Users/jinlin/Desktop/python_further_study/并發編程/死鎖與遞歸鎖(Rlock).py
Thread-1獲取到了A鎖
Thread-1獲取到了B鎖
Thread-1獲取到了B鎖
Thread-1獲取到了A鎖
Thread-2獲取到了A鎖
Thread-2獲取到了B鎖
Thread-2獲取到了B鎖
Thread-2獲取到了A鎖
Thread-4獲取到了A鎖
Thread-4獲取到了B鎖
Thread-4獲取到了B鎖
Thread-4獲取到了A鎖
Thread-6獲取到了A鎖
Thread-6獲取到了B鎖
Thread-6獲取到了B鎖
Thread-6獲取到了A鎖
Thread-8獲取到了A鎖
Thread-8獲取到了B鎖
Thread-8獲取到了B鎖
Thread-8獲取到了A鎖
Thread-10獲取到了A鎖
Thread-10獲取到了B鎖
Thread-10獲取到了B鎖
Thread-10獲取到了A鎖
Thread-5獲取到了A鎖
Thread-5獲取到了B鎖
Thread-5獲取到了B鎖
Thread-5獲取到了A鎖
Thread-9獲取到了A鎖
Thread-9獲取到了B鎖
Thread-9獲取到了B鎖
Thread-9獲取到了A鎖
Thread-7獲取到了A鎖
Thread-7獲取到了B鎖
Thread-7獲取到了B鎖
Thread-7獲取到了A鎖
Thread-3獲取到了A鎖
Thread-3獲取到了B鎖
Thread-3獲取到了B鎖
Thread-3獲取到了A鎖進程已結束,退出代碼0
'''

?

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

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

相關文章

VScode 快速更改編碼格式

1、view下的 Cmmand Palette 下的Change file Encoding simplifiled chinese GB2312

iostat

r/s: 每秒讀取的請求數。 w/s: 每秒寫入的請求數。 Avgqu-sz: 平均I/O隊列長度 Await:平均每次設備I/O操作的等待時間(毫秒) Svctm:平均每次設置I/O操作的服務時間(毫秒),Svctm越接近Await則說明等待時間少 %util:表示設備的繁忙程度,80%表示設備設備已經…

學習筆記(29):Python網絡編程并發編程-信號量

立即學習:https://edu.csdn.net/course/play/24458/296446?utm_sourceblogtoedu 信號量(了解):也是一把鎖semaphore 1. from threading import Thread,Semaphore,currentThread import time#定義信號量(3把鎖) sm Semaphore(3)def task()…

Ajax基礎2

什么是服務器 網頁瀏覽過程的分析 如何配置自己的服務器程序(AMP) 什么是Ajax 無刷新數據讀取 異步,同步 Ajax基礎(2) 使用Ajax 基礎請求顯示txt的文件 字符集編碼 緩存,阻止緩存 動態數據,請求js或(json&a…

動態SQL應用(成績排名)

Code-- 年級排名和班級排名declare sql varchar(4000),nclassid int,nexamid int select sql select nclassid38 select nexamid19select sqlsqlmax(case scoursename when scoursename then descore else 0 end) scoursename,from (select distinct scoursename from t_card_…

《將進酒》——李白

君不見,黃河之水天上來,奔流到海不復回。 君不見,高堂明鏡悲白發,朝如青絲暮成雪。 人生得意尋盡歡,莫使金樽空對月。 天生我材必有用,千金散盡還復來。 烹羊宰牛且為樂,會須一飲三百杯。 岑夫子…

關于windows上的exe可執行程序在黑色窗口運行時候不能點擊屏幕,要不然會暫定程序

關于windows上的exe可執行程序在黑色窗口運行時候不能點擊屏幕,要不然會暫定程序 2019-12-3 記錄

學習筆記(30):Python網絡編程并發編程-Event事件

立即學習:https://edu.csdn.net/course/play/24458/296447?utm_sourceblogtoedu threading.Event事件 1.概念及功能:主要是完成線程之間的通信,將另一個線程的運行狀態通知給另一個線程 2.使用場景: 1)客戶端運行時等待服務器啟…

Java操作ftp,上傳,下載,刪除操作

使用java commons net包中的api可以方便操作ftp操作。 import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream;import org.apache.commons.net.ftp.F…

Dynagen0.11+Pemuwrapper入手麻煩二三事——告訴初學者直路

Dynagen在數度難產后終于誕生了0.11版本,這是個里程碑似的版本,他整合了confDynagen和Pemuwrapper,使得我們在搭建復雜安全環境下的拓撲變得更容易和易于調整。confDynagen的具體介紹這里就從略了,我們著重看下Pemuwrapper的問題。…

第五部分 一階邏輯等值演算與推理

目錄 基本等值式 例1 將下面命題用兩種形式符號化, 并證明兩者等值: 例2 將公式化成等值的不含既有約束出現、又有自由出現 例3 設個體域D{a,b,c}, 消去下述公式中的量詞: 例4 求下列公式的前束范式 推理的形式結構 定義5.3 自然推理系統 構造推理證明的實例 例5 在自然推理系…

從易到難,寫一個JavaScript加載器之一

先上代碼: 1 (function(global) {2 var createScript, insertScript, makeLoadQueue;3 createScript function(src) {4 var script;5 script document.createElement(SCRIPT);6 script.src "" src ".js";7 return script;8 };9…

關于怎么怎么把 unsingned char 數據轉換為 Opencv 的Mat類型,并且吧圖像顯示出來

1、定義 unsignde char* A; 2、定義cv::Mat B(cv::Size(800,500),CV_8U) 3、使用c語言的 memcpy(B.data, A,800*500)//將A指針的數據復制到B中的數據內存,并且給出內存大小 4最后unsignde char 類型數據就會被轉化為Mat類型,并且可以顯示出…

學習筆記(31):Python網絡編程并發編程-定時器

立即學習:https://edu.csdn.net/course/play/24458/296448?utm_sourceblogtoedu 定時器:threading.Timer 1.概念:定時器就是實現過多久去執行什么事情 2.相關函數 1)Timer(self,interval,function,args()) interval:定時的時間 functio…

vs2012 與 win7 不兼容的問題

我用的是win7 64位系統,所以安裝位置那里是“C:\Program Files (x86)”,多了個(x86)。 百度搜索到園子里的師兄給的解決辦法http://www.cnblogs.com/mumuliang/archive/2013/08/20/3270628.html 裝這個補丁: Update for Microsoft Visual Stu…

Scrum方法論(四)

本文轉自桂素偉51CTO博客,原文鏈接: http://blog.51cto.com/axzxs/1358371,如需轉載請自行聯系原作者

atoi(),函數,將字符串轉為整形數字

C 庫函數 int atoi(const char *str) 把參數 str 所指向的字符串轉換為一個整數&#xff08;類型為 int 型&#xff09;。 測試用例&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h>int main() {int val;char str[20];strcpy(str, …

學習筆記(32):Python網絡編程并發編程-線程queue

立即學習:https://edu.csdn.net/course/play/24458/296449?utm_sourceblogtoedu 線程queue 一&#xff1a;Queue先進先出 1.queue.Queue(n):創建一個最大容量為n的隊列 2.queue.Queue(n).put():添加元素 3.queue.Queue(n).get():取元素 4.put()和get(),默認阻塞狀態為True&am…

第一天,仔細學習了下:common.inc.php(Discuz6.1.0核心文件)01

<?php /* April 18,2012 discuz二次開發學習 author:xuqin 不能為了完成任務去做一件事&#xff0c;要舉一反三&#xff0c;融會貫通的去學習。 */ error_reporting(0); /* * error_reporting(0); //抑制所有的出錯信息 * error_reporting(E_ALL);//顯示所有的出錯信息 …

acdream 1023 xor按位思考

思路&#xff1a;記答案為ans&#xff0c;統計出數列A和B在某二進制某一位上有多少個1&#xff0c;如果個數相同&#xff0c;則ans那一位上為0&#xff08;因為題目要求最小的滿足條件的值&#xff09;&#xff0c;如果不一樣&#xff08;則需要考慮那一位上異或個1&#xff09…