python多线程网络编程_python之网络编程-多线程
死鎖現象,遞歸鎖
所謂死鎖:是指兩個或兩個以上的進程或線程在執行過程中,因為爭奪資源而造成的一種互相等待的現象,若無外力作用,他們將無法推進下去,此時稱系統處于死鎖狀態或系統產生了死鎖,這些永遠在相互等待的進程稱為死鎖進程。
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
# 鎖死了....
遇到死鎖現象可通過 遞歸鎖解決。
在Python中為了支持在同一線程中多次請求同一資源,python提供了可重入鎖RLock。
這個RLock內部維護著一個Lock和一個counter變量,counter記錄了acquire的次數,從而使得資源可以被多次require。直到一個線程所有的acquire都被release,其他的線程才能獲得資源。上面的例子如果使用RLock代替Lock,則不會發生死鎖:
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一次,鎖上就計數1次, acquire2次,鎖上就計數2次,
release1次,減一,
只要遞歸鎖計數不為0,其他線程不能搶.
'''
總結
以上是生活随笔為你收集整理的python多线程网络编程_python之网络编程-多线程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 拦截锚点修改url_前端系列课程(2)-
- 下一篇: python顺时针打印矩阵_python