python 互斥鎖,死鎖

2021-10-02 18:35:02 字數 3096 閱讀 9321

同步與非同步之間的區別:

1.同步:可以理解為執行緒a和b一塊配合工作,a執行到一定程度時要依靠b的某個結

果,於是停下來示意b執行,b執行完將結果給a,然後a繼續執行。

2.非同步:非同步是指程序不需要一直等待下去,而是繼續執行下面的操作,不管其他程序的狀態,當有資訊返回的時候會通知程序進行處理,這樣就可以提高執行的效率了,即非同步是我們發出的乙個請求,該請求會在後台自動發出並獲取資料,然後對資料進行處理,在此過程中,我們可以繼續做其他操作,不管它怎麼發出請求,不關心它怎麼處理資料。

自己理解:

在車間生產零件,可能需要組裝乙個東西,需要一步步來做,而且按照步驟組裝,這是同步,非同步在組裝同乙個東西時候,我們可以用3d列印技術做出來,不用進行一步步組裝也能達到成功生產,這可以認為是非同步。

1.互斥鎖:個執行緒幾乎同時修改乙個共享資料的時候,需要進行同步控制,執行緒同步能夠保證多個

執行緒安全的訪問競爭資源(全域性內容),簡單的同步機制就是使用互斥鎖。

某個執行緒要更改共享資料時,先將其鎖定,此時資源的狀態為鎖定狀態,其他執行緒就能更

改,直到該執行緒將資源狀態改為非鎖定狀態,也就是釋放資源,其他的執行緒才能再次鎖定資

源。互斥鎖保證了每一次只有乙個執行緒進入寫入操作。從而保證了多執行緒下資料的安全性。

自己理解:比如去取錢,當只有乙個atm取款機時候,為了金主的安全,取錢時候會給門上鎖,金主在取錢過後再開啟鎖,接著後面的人也一樣可以安全的取到錢了。

)#建立乙個全域性鎖物件

defwork1

(num)

:global g_num

lock.acquire(

)#加鎖

for i in

range

(num)

: g_num +=

1 lock.release(

)#解鎖

print

('in work1-->'

,g_num)

defwork2

(num)

:global g_num

lock.acquire(

)#加鎖

for i in

range

(num)

: g_num +=

1 lock.release(

)#解鎖

print

('in work1-->'

,g_num)

defmain()

: t1 = thread(target=work1,args=

(10000000,)

)#100000萬次自加一

t2 = thread(target=work2,args=

(10000000,)

) t1.start(

) t2.start(

) t2.join(

)if __name__ ==

'__main__'

: main(

)print

('main :'

, g_num)

#結果:

in work1-

->

10000000

in work1-

->

20000000

main : 20000000

2.死鎖:在多個執行緒共享資源的時候,如果兩個執行緒分別占有一部分資源,並且同時等待對方的資

源,就會造成死鎖現象。如果鎖之間相互巢狀,就有可能出現死鎖。因此盡量不要出現鎖之間的巢狀

from threading import thread

from threading import lock

lock1 = lock(

)lock2 = lock(

)import time

defwork1

(num)

: lock1.acquire(

)#1上鎖

print

('work1,上鎖1'

) time.sleep(1)

lock2.acquire(

)#2上鎖

print

('work1,上鎖2'

) lock2.release(

)#1解鎖

print

('解鎖2'

) lock1.release(

)#2解鎖

print

('解鎖1'

)def

work2

(num)

: lock2.acquire(

)print

('work2,上鎖1'

) lock1.acquire(

)print

('work2,上鎖2'

) lock1.release(

)print

('解鎖1'

) lock2.release(

)print

('解鎖2'

)if __name__ ==

'__main__'

: t1 = thread(target=work1,args=

(1000000,)

) t2 = thread(target=work2,args=

(1000000,)

) t1.start(

) t2.start(

)

執行:

給兩個執行緒都安了兩把鎖,在work1鎖完後使用資源,等待1秒,同時work2也上了鎖,使用資源,這時候出現都在用一部分資源,都在等待對方的資源,所以形成乙個僵局,變成死鎖了。

Python互斥鎖 死鎖

死鎖當多個執行緒幾乎同時修改某乙個共享資料的時候,需要進行同步控制。執行緒同步能夠保證多個執行緒安全訪問競爭資源,最簡單的同步機制是引入互斥鎖。互斥鎖為資源引入乙個狀態 鎖定 非鎖定 某個執行緒要更改共享資料時,先將其鎖定,此時資源的狀態為 鎖定 其他執行緒不能更改 直到該執行緒釋放資源,將資源的狀...

python 互斥鎖 死鎖

在多執行緒下,全域性變數是共享的,但是在兩個執行緒同時使用乙個全域性變數時,會出現這麼乙個情況,當a讀取了全域性變數a,b也讀取全域性變數a,a對a進行了 1操作,但是b是讀取a沒有進行一次 1操作之前的資料,然後b也進行 1操作,這就導致這錯誤的出現。為了防止這個錯誤的出現,所以引進互斥鎖。使用鎖...

python 互斥鎖與死鎖

一.概念原理 當多個執行緒幾乎同時修改某乙個共享資料的時候,需要進行同步控制 執行緒同步能夠保證多個執行緒安全訪問競爭資源,最簡單的同步機制是引入互斥鎖。互斥鎖為資源引入乙個狀態 鎖定 非鎖定。某個執行緒要更改共享資料時,先將其鎖定,此時資源的狀態為 鎖定 其他執行緒不能更改 直到該執行緒釋放資源,...