python多线程网络编程_python之网络编程-多线程
死鎖現(xiàn)象,遞歸鎖
所謂死鎖:是指兩個(gè)或兩個(gè)以上的進(jìn)程或線程在執(zhí)行過程中,因?yàn)闋?zhēng)奪資源而造成的一種互相等待的現(xiàn)象,若無外力作用,他們將無法推進(jìn)下去,此時(shí)稱系統(tǒng)處于死鎖狀態(tài)或系統(tǒng)產(chǎn)生了死鎖,這些永遠(yuǎn)在相互等待的進(jìn)程稱為死鎖進(jìn)程。
from threading import Thread
from threading import Lock
import time
lock_A = Lock()
lock_B = Lock()
class MyThread(Thread):
def run(self):
self.f1()
self.f2()
def f1(self):
lock_A.acquire()
print(f'{self.name}拿到了鎖A')
lock_B.acquire()
print(f'{self.name}拿到了鎖B')
lock_B.release()
lock_A.release()
def f2(self):
lock_B.acquire()
print(f'{self.name}拿到了鎖B')
time.sleep(1)
lock_A.acquire()
print(f'{self.name}拿到了鎖A')
lock_A.release()
lock_B.release()
if __name__ == '__main__':
for i in range(1,4):
t = MyThread()
t.start()
# Thread-1拿到了鎖A
# Thread-1拿到了鎖B
# Thread-1拿到了鎖B
# Thread-2拿到了鎖A
# 鎖死了....
遇到死鎖現(xiàn)象可通過 遞歸鎖解決。
在Python中為了支持在同一線程中多次請(qǐng)求同一資源,python提供了可重入鎖RLock。
這個(gè)RLock內(nèi)部維護(hù)著一個(gè)Lock和一個(gè)counter變量,counter記錄了acquire的次數(shù),從而使得資源可以被多次require。直到一個(gè)線程所有的acquire都被release,其他的線程才能獲得資源。上面的例子如果使用RLock代替Lock,則不會(huì)發(fā)生死鎖:
from threading import Thread
from threading import RLock
import time
lock_A = RLock()
class MyThread(Thread):
def run(self):
self.f1()
self.f2()
def f1(self):
lock_A.acquire()
print(f'{self.name}拿到了鎖A')
lock_A.acquire()
print(f'{self.name}拿到了鎖B')
lock_A.release()
lock_A.release()
def f2(self):
lock_A.acquire()
print(f'{self.name}拿到了鎖B')
time.sleep(1)
lock_A.acquire()
print(f'{self.name}拿到了鎖A')
lock_A.release()
lock_A.release()
if __name__ == '__main__':
for i in range(1,4):
t = MyThread()
t.start()
# 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-3拿到了鎖A
# Thread-3拿到了鎖B
# Thread-3拿到了鎖B
# Thread-3拿到了鎖A
'''
遞歸鎖是一把鎖,鎖上有記錄,只要acquire一次,鎖上就計(jì)數(shù)1次, acquire2次,鎖上就計(jì)數(shù)2次,
release1次,減一,
只要遞歸鎖計(jì)數(shù)不為0,其他線程不能搶.
'''
總結(jié)
以上是生活随笔為你收集整理的python多线程网络编程_python之网络编程-多线程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 拦截锚点修改url_前端系列课程(2)-
- 下一篇: python顺时针打印矩阵_python