python中解决死锁的方法
1.添加超時時間:
fromthreading import Thread, Lock
importtime
?
mutex1= Lock()? # 創建一個互斥鎖
mutex2= Lock()? # 創建一個互斥鎖
?
?
def fun1():
??? while True:
??????? mutex1.acquire()
??????? print("線程1 鎖住了mutex1")
??????? time.sleep(0.1)
?
??????? result =mutex2.acquire(timeout=1)? # timeout指明acquire等的最長超時時間
??????? # result = mutex2.acquire(False)? # 非阻塞
??????? if result:
??????????? # 表示對mutex2成功上鎖
??????????? print("線程1 鎖住了mutex2")
??????????? print("線程1 hello")
??????????? mutex1.release()
??????????? mutex2.release()
??????????? break
??????? else:
??????????? # 表示對mutex2上鎖失敗
???????????mutex1.release()? # 將mutex1釋放,保證別人能夠執行
??????????? time.sleep(0.1)
?
?
def fun2():
??? mutex2.acquire()
??? print("線程2 鎖住了mutex2")
??? time.sleep(0.1)
??? mutex1.acquire()
??? print("線程2 鎖住了mutex1")
??? print("線程2 hi")
?
??? mutex1.release()
??? mutex2.release()
?
2.附錄-銀行家算法( 不要求,理解就可以
?
[背景知識]
一個銀行家如何將一定數目的資金安全地借給若干個客戶,使這些客戶既能借到錢完成要干的事,同時銀行家又能收回全部資金而不至于破產,這就是銀行家問題。這個問題同操作系統中資源分配問題十分相似:銀行家就像一個操作系統,客戶就像運行的進程,銀行家的資金就是系統的資源。
?
[問題的描述]
一個銀行家擁有一定數量的資金,有若干個客戶要貸款。每個客戶須在一開始就聲明他所需貸款的總額。若該客戶貸款總額不超過銀行家的資金總數,銀行家可以接收客戶的要求。客戶貸款是以每次一個資金單位(如1萬RMB等)的方式進行的,客戶在借滿所需的全部單位款額之前可能會等待,但銀行家須保證這種等待是有限的,可完成的。
?
例如:有三個客戶C1,C2,C3,向銀行家借款,該銀行家的資金總額為10個資金單位,其中C1客戶要借9各資金單位,C2客戶要借3個資金單位,C3客戶要借8個資金單位,總計20個資金單位。某一時刻的狀態如圖所示。
?
對于a圖的狀態,按照安全序列的要求,我們選的第一個客戶應滿足該客戶所需的貸款小于等于銀行家當前所剩余的錢款,可以看出只有C2客戶能被滿足:C2客戶需1個資金單位,小銀行家手中的2個資金單位,于是銀行家把1個資金單位借給C2客戶,使之完成工作并歸還所借的3個資金單位的錢,進入b圖。同理,銀行家把4個資金單位借給C3客戶,使其完成工作,在c圖中,只剩一個客戶C1,它需7個資金單位,這時銀行家有8個資金單位,所以C1也能順利借到錢并完成工作。最后(見圖d)銀行家收回全部10個資金單位,保證不賠本。那麼客戶序列{C1,C2,C3}就是個安全序列,按照這個序列貸款,銀行家才是安全的。否則的話,若在圖b狀態時,銀行家把手中的4個資金單位借給了C1,則出現不安全狀態:這時C1,C3均不能完成工作,而銀行家手中又沒有錢了,系統陷入僵持局面,銀行家也不能收回投資。
?
綜上所述,銀行家算法是從當前狀態出發,逐個按安全序列檢查各客戶誰能完成其工作,然后假定其完成工作且歸還全部貸款,再進而檢查下一個能完成工作的客戶,......。如果所有客戶都能完成工作,則找到一個安全序列,銀行家才是安全的。
?
總結
以上是生活随笔為你收集整理的python中解决死锁的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Django后端编辑图片提取主要颜色AP
- 下一篇: python中的创建对象