問題:已經有了全域性直譯器鎖為什麼還需要鎖?
答:全域性直譯器鎖是在cpython直譯器下,同一時刻,多個執行緒只能有乙個執行緒被cpu排程
鎖的分類
1、互斥鎖
2、死鎖
3、遞迴鎖
#雖然有全域性直譯器鎖,資料仍然出現了安全問題
from threading import
thread
import
time
deftest():
global
n temp =n
time.sleep(1)
n = temp - 1n = 10t_li =
for i in range(5):
t = thread(target=test)
t.start()
[t.join()
for t in
t_li]
print(n) #
9
互斥鎖
#使用鎖,解決了資料安全問題
from threading import
thread, lock
import
time
deftest(lock):
lock.acquire()
global
n temp =n
time.sleep(1)
n = temp - 1lock.release()
n = 10lock =lock()
t_li =
for i in range(5):
t = thread(target=test, args=(lock, ))
t.start()
[t.join()
for t in
t_li]
print(n) #
5
死鎖
#科學家吃麵
from threading import
lock
from threading import
thread
import
time
noddle =lock()
chopsticks =lock()
deftest1(name):
noddle.acquire()
print('
%s拿到麵條
' %name)
#time.sleep(2)
chopsticks.acquire()
print('
%s拿到筷子
' %name)
print('
%s吃麵
' %name)
#time.sleep(1)
chopsticks.release()
noddle.release()
deftest2(name):
chopsticks.acquire()
print('
%s拿到筷子
' %name)
time.sleep(0.3)
noddle.acquire()
print('
%s拿到麵條
' %name)
print('
%s吃麵
' %name)
noddle.release()
chopsticks.release()
t1 = thread(target=test1, args=('
tom'
, ))
t1.start()
t2 = thread(target=test2, args=('
abc'
, ))
t2.start()
t3 = thread(target=test1, args=('
joker
', ))
t3.start()
t4 = thread(target=test2, args=('ff'
, ))
t4.start()
遞迴鎖
#遞迴鎖,多個acquire()不會造成死鎖
from threading import
rlock
from threading import
thread
a =rlock()
deftest():
a.acquire()
a.acquire()
a.acquire()
print('
hello, world')
thread(target=test).start()
#科學家吃麵 遞迴鎖
from threading import
rlock
from threading import
thread
import
time
noddle = chopsticks =rlock()
deftest1(name):
noddle.acquire()
print('
%s拿到麵條
' %name)
#time.sleep(2)
chopsticks.acquire()
print('
%s拿到筷子
' %name)
print('
%s吃麵
' %name)
#time.sleep(1)
chopsticks.release()
noddle.release()
deftest2(name):
chopsticks.acquire()
print('
%s拿到筷子
' %name)
time.sleep(0.3)
noddle.acquire()
print('
%s拿到麵條
' %name)
print('
%s吃麵
' %name)
noddle.release()
chopsticks.release()
t1 = thread(target=test1, args=('
tom'
, ))
t1.start()
t2 = thread(target=test2, args=('
abc'
, ))
t2.start()
t3 = thread(target=test1, args=('
joker
', ))
t3.start()
t4 = thread(target=test2, args=('ff'
, ))
t4.start()
pyhton鎖機制,程序池
第一,程序鎖,本來程序是各自的,本不要加鎖,但是在螢幕上輸出列印時為了防止混亂,在程序模組有乙個鎖函式,使用如下,需要說明是在py3以上版本沒 有出現在過螢幕輸出混亂,可以不加,這方法不重要,但是作為學習,了解一下好,輸出順序亂是程序運算,我這兒說的是print 這個輸出!pfrom multipr...
pyhton多執行緒練習
一.ip 位址歸屬地批量查詢任務 使用建立子類的方式實現多執行緒任務 二.基於多執行緒的批量主機存活探測 注意 使用例項化物件的方式實現多執行緒任務 專案描述 如果要在本地網路中確定哪些位址處於活動狀態或哪些計算機處於活動狀態,則可以使用此指令碼。我們將依次 ping 位址,每次都要等幾秒鐘才能返回...
執行緒鎖與避免執行緒鎖 執行緒鎖檢測
程序是資源共享的,執行緒是資源私有的。死鎖的四個必要條件 在計算機專業的本科教材中,通常都會介紹死鎖的四個必要條件。這四個條件缺一不可,或者說只要破壞了其中任何乙個條件,死鎖就不可能發生。我們來複習一下,這四個條件是 互斥 mutual exclusion 存在這樣一種資源,它在某個時刻只能被分配給...