同步與非同步之間的區別:
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(
)#解鎖
('in work1-->'
,g_num)
defwork2
(num)
:global g_num
lock.acquire(
)#加鎖
for i in
range
(num)
: g_num +=
1 lock.release(
)#解鎖
('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(
('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 互斥鎖與死鎖
一.概念原理 當多個執行緒幾乎同時修改某乙個共享資料的時候,需要進行同步控制 執行緒同步能夠保證多個執行緒安全訪問競爭資源,最簡單的同步機制是引入互斥鎖。互斥鎖為資源引入乙個狀態 鎖定 非鎖定。某個執行緒要更改共享資料時,先將其鎖定,此時資源的狀態為 鎖定 其他執行緒不能更改 直到該執行緒釋放資源,...