日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

学习笔记(28):Python网络编程并发编程-死锁与递归锁

發(fā)布時(shí)間:2023/12/10 python 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 学习笔记(28):Python网络编程并发编程-死锁与递归锁 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

立即學(xué)習(xí):https://edu.csdn.net/course/play/24458/296445?utm_source=blogtoedu

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

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

?

1)死鎖情況1

#死鎖情況1 from threading import Thread,Lock import time #設(shè)置了兩把互斥鎖 mutexA = Lock() mutexB = Lock()class mythread(Thread):def run(self):self.f1()self.f2()def f1(self):#首先線程1獲得了A鎖,再獲得B鎖,最后兩個(gè)都釋放,開(kāi)始進(jìn)行f2中的B鎖,因?yàn)槌了?.1秒,足以讓線程2獲得f1中的A鎖,接下來(lái)線程1的工作是沉睡結(jié)束后獲得A鎖,線程2準(zhǔn)備獲得B鎖,一直處于等待鎖的釋放,因?yàn)榫€程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__':#線程切換的速度非常快,因此可以看成是依次線程執(zhí)行的for i in range(10):t = mythread()t.start()

?

2)死鎖情況2

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

?

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

知識(shí)點(diǎn):RLock(),

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

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

#遞歸鎖情況 from threading import Thread,RLock import time #設(shè)置了兩把互斥鎖 mutexA = mutexB = RLock()class mythread(Thread):def run(self):self.f1()self.f2()def f1(self):#首先線程1獲得了A鎖計(jì)數(shù)器+1為1,再獲得B鎖計(jì)數(shù)器+1為2,最后兩個(gè)都釋放計(jì)數(shù)器歸零,鎖可以被其他線程獲取,因?yàn)榫€程速度快,所以線程1獲取到了f2的B鎖,計(jì)數(shù)器為1,因?yàn)槌了?.1秒且線程1的計(jì)數(shù)器為1,雖然足以讓線程2去獲得f1中的A鎖,但是條件不允許啊(計(jì)數(shù)器不歸零),接下來(lái)線程1的工作是沉睡結(jié)束后獲得A鎖,計(jì)數(shù)器為2,線程1釋放兩次后計(jì)數(shù)器為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__':#線程切換的速度非常快,因此可以看成是依次線程執(zhí)行的for i in range(10):t = mythread()t.start() #運(yùn)行結(jié)果 ''' "F:\software install\python3.6.4\python.exe" C:/Users/jinlin/Desktop/python_further_study/并發(fā)編程/死鎖與遞歸鎖(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鎖進(jìn)程已結(jié)束,退出代碼0 '''

?

總結(jié)

以上是生活随笔為你收集整理的学习笔记(28):Python网络编程并发编程-死锁与递归锁的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。