学习笔记(28):Python网络编程并发编程-死锁与递归锁
生活随笔
收集整理的這篇文章主要介紹了
学习笔记(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)題。
- 上一篇: HDU 1284 钱币兑换问题 (动态规
- 下一篇: 学习笔记(29):Python网络编程并