python死鎖和解決方案遞迴鎖

2022-04-28 23:00:25 字數 1591 閱讀 8586

# 所謂死鎖: 是指兩個或兩個以上的程序或執行緒在執行過程中,因爭奪資源而造成的一種互相等待的現象,

# 若無外力作用,它們都將無法推進下去。

# 此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。

# 解決方案:將所有鎖改編成遞迴鎖rlock

# 在python中為了支援在同一執行緒中多次請求同一資源,python提供了可重入鎖rlock。

# 這個rlock內部維護著乙個lock和乙個counter變數,counter記錄了acquire的次數,從而使得資源可以被多次require。

# 直到乙個執行緒所有的acquire都被release,其他的執行緒才能獲得資源。上面的例子如果使用rlock代替lock,則不會發生死鎖。

# 不要瞧不起最原始的序列,那是解決執行緒安全問題最原始最有效的方法

# rlock = threading.rlock()

# rlock 代替所有mutex

import threading

import time

# mutexa = threading.lock()

# mutexb = threading.lock()

rlock = threading.rlock()

class mythread(threading.thread):

def __init__(self):

threading.thread.__init__(self)

def run(self):

self.fun1()

self.fun2()

def fun1(self):

rlock.acquire() # 如果鎖被占用,則阻塞在這裡,等待鎖的釋放

print ("i am %s , get res: %s---%s" %(self.name, "resa",time.time()))

rlock.acquire()

print ("i am %s , get res: %s---%s" %(self.name, "resb",time.time()))

rlock.release()

rlock.release()

def fun2(self):

rlock.acquire()

print ("i am %s , get res: %s---%s" %(self.name, "resb",time.time()))

time.sleep(0.2)

rlock.acquire()

print ("i am %s , get res: %s---%s" %(self.name, "resa",time.time()))

rlock.release()

rlock.release()

if __name__ == "__main__":

print("start---------------------------%s"%time.time())

for i in range(0, 10):

my_thread = mythread()

my_thread.start()

造成死鎖的原因和解決方案

計算機系統中,如果系統的資源分配策略不當,更常見的可能是程式設計師寫的程式有錯誤等,則會導致程序因競爭資源不當而產生死鎖的現象。產生死鎖的原因主要是 1 因為系統資源不足。2 程序執行推進的順序不合適。3 資源分配不當等。如果系統資源充足,程序的資源請求都能夠得到滿足,死鎖出現的可能性就很低,否則就...

C 中async的死鎖分析和解決方案

如果你開發乙個簡單的windows form程式,點選button去使用async非同步獲取乙個資料,然後顯示在label上,類似這樣的 private void button1 click object sender,eventargs e public async task getcontent...

Oracle Job 死鎖解決方案

oracle執行定時job時,經常會遇到job意外死鎖,或者一些job執行的程式有對外的介面,當網路中斷或不穩定時,造成job死鎖,占用資源,以下為解決方法 如果不想job釋放後馬上又重新執行,請先將job在資料庫中broken 1.檢視正在執行job的job id sid serial spid資...