python死鎖案例 Python執行緒 死鎖

2021-10-11 13:14:32 字數 1563 閱讀 5303

死鎖產生的4個必要條件:

1、互斥:乙個資源同一時刻只允許乙個執行緒進行訪問。

2、占有未釋放:乙個執行緒占有資源,且沒有釋放資源。

3、不可搶占:乙個已經占有資源的執行緒無法搶占到其他執行緒擁有的資源。

4、迴圈等待:兩個或者兩個以上的執行緒,本身擁有資源,不釋放資源,並且同時嘗試獲得其他執行緒所持有的資源,這種資源的申請關係形成乙個閉環的鏈條。

死鎖的避免:

關於死鎖的避免,仁者見仁智者見智。

主要還是從造成死鎖的四個條件入手,四個條件不能滿足,就不會死鎖。

以下是我本人的一些方法:

1.執行緒等待時(wait)給予乙個預設的等待時間

2.執行緒之間資源避免相互申請對方的資源,可以通過一些容器來控制併發,比如blockqueue,等等一些執行緒安全的容器

3.盡量避免執行緒在等待的同時申請資源

4.死鎖檢測,乙個執行緒在等待一段時間後還沒有獲得資源就放棄申請。對等待時間進行檢測。

乙個死鎖的例子:

#執行緒死鎖,在classa和classb相互呼叫對方的方法,並且相互等待對方釋放資源

classclassa:def __init__(self):

self.lock=threading.rlock()#得到classa的鎖,試圖得到classb的鎖

definfoa(self, b):

self.lock.acquire()

time.sleep(10)

b.info()

self.lock.release()definfo(self):

self.lock.acquire()print("this is classa info")

self.lock.release()classclassb:def __init__(self):

self.lock=threading.rlock()#得到classb的鎖,試圖得到classa的鎖

definfob(self, a):

self.lock.acquire()

time.sleep(10)

a.info()

self.lock.release()definfo(self):

self.lock.acquire()print("this is classb info")

self.lock.release()

ca=classa()

cb=classb()deffuna():

ca.infoa(cb)deffunb():

cb.infob(ca)#函式呼叫不是執行緒,不會死鎖#funa()#funb()

t1=threading.thread(target=funa).start()

t2=threading.thread(target=funb).start()

說明:執行緒|狀態

classa

獲得classa的鎖,sleep(classa的鎖未釋放)

申請classb的鎖

死鎖classb

獲得classb的鎖,sleep(classb的鎖未釋放)

申請classa的鎖

死鎖

python死鎖案例 Python 多執行緒死鎖

場景是這樣的 開啟多個執行緒訪問外部 api 過一段時間,發現所有執行緒死鎖。環境 python2.6.7 centos7.1 urllib2 suse 下無此問題。dump 如下 thread 161 thread 0x7f80de4e9700 lwp 12459 0 0x00007f80e4ca...

死鎖案例分析

死鎖的產生以及解決辦法,看 分析,注意裡邊的注釋,自行執行。package thread 模擬買票 author yhl class thread02 implements runnable else 同步 塊 public void sale catch interruptedexception ...

死鎖的案例

死鎖就是當有兩個或兩個以上的執行緒都獲得對方的資源,但彼此有不肯放開,處於僵持狀態,此時便造成了死鎖 package cn.et.deadlock public class deadlock implements runnable catch interruptedexception e synch...