互斥鎖,遞迴鎖,訊號量
以上都是程序(執行緒)鎖,下面我就一一解釋一下
最普通互斥鎖
from threading import看一下最後執行時間,如果沒有互斥鎖,執行緒是並行執行,時間在1s多點,而有互斥鎖後,執行緒變成序列執行,時間是10s多點,thread,lock
import
time
defwork():
l.acquire()
time.sleep(1)
print('ok'
) l.release()
if__name__ == '
__main__':
l =lock()
t_l =
start =time.time()
for i in range(10):
t = thread(target=work)
t.start()
for t in
t_l:
t.join()
print(time.time()-start)
它有什麼作用:保證同一時間只有乙個程序(執行緒在修改資料,從而使修改的共享資料安全),也是為什麼cpython直譯器不能在同一程序內真正意義上併發執行緒(gil鎖)
遞迴鎖
from threading import遞迴鎖以上**的效果是執行緒全部序列執行(哪個執行緒搶到鎖哪個執行,不一定執行緒會按順序執行)thread,rlock
import
time
mutex =rlock()
class
my_thread(thread):
def__init__
(self):
super().
__init__
() self.count =0
defrun(self):
self.f1()
self.f2()
deff1(self):
mutex.acquire()
self.count += 1time.sleep(0.5)
print('
%s is use lock %s
'%(self.getname(),self.count))
mutex.acquire()
self.count += 1time.sleep(0.5)
print('
%s is use lock %s
' %(self.getname(), self.count))
mutex.release()
self.count -= 1
print('
%s is use lock %s
' %(self.getname(), self.count))
mutex.release()
self.count -= 1
print('
%s is use lock %s
' %(self.getname(), self.count))
deff2(self):
mutex.acquire()
time.sleep(0.5)
self.count += 1
print('
%s is use lock %s
' %(self.getname(), self.count))
mutex.acquire()
self.count += 1time.sleep(0.5)
print('
%s is use lock %s
' %(self.getname(), self.count))
mutex.release()
self.count -= 1
print('
%s is use lock %s
' %(self.getname(), self.count))
mutex.release()
self.count -= 1
print('
%s is use lock %s
' %(self.getname(), self.count))
if__name__ == '
__main__':
for i in range(10):
t =my_thread()
t.start()
訊號量
作用:同時生成多把鎖,有幾把鎖就能同時執行幾個程序(執行緒),有點類似程序池,不同電視,程序池會一直執行到沒有任務了,開的程序才會死,就是說不管你執行多少任務,給你執行的程序就是原來執行完任務的程序,人家等著你給下乙個任務呢,他還是他一直存活;訊號量是有幾個(程序)執行緒得到鎖後開始執行,執行完就死了,下乙個拿鎖的就執行,但下乙個程序(執行緒)已經不是原來的程序(執行緒)了,他是新的,原來的已經死了
from threading importthread,semaphore,currentthread
import
time,random
se = semaphore(5)
defwork():
se.acquire()
print('
%s is running
'%currentthread().getname())
time.sleep(random.randint(1,4))
print('
%s is done
' %currentthread().getname())
se.release()
if__name__ == '
__main__':
t_l =
for i in range(30):
t = thread(target=work)
t.start()
for t in
t_l:
t.join()
互斥鎖 死鎖 遞迴鎖 訊號量 GIL鎖
互斥鎖lock也是一種阻塞,可以保證共享資料操作的完整性。保證在任一時刻,只能有乙個執行緒訪問該物件 from multiprocessing import process from threading import thread from multiprocessing import lock 程...
訊號量,互斥鎖
注 摘自 程式設計師的自我修養 相關章節。關鍵字 執行緒同步 原子操作 鎖 二元訊號量 訊號量 互斥量 臨界區 讀寫鎖 條件變數 原子操作 共享資料 全域性變數或堆變數 的自增 操作在多執行緒環境下會出現錯誤是因為這個操作 一條c語句 被編譯為彙編 後不止一條指令,因此在執行的時候可能執行了一半就被...
訊號量 互斥鎖
訊號量與普通整型變數的區別 訊號量 semaphore 是非負整型變數,除了初始化之外,它只能通過兩個標準原子操作 wait semap signal semap 來進行訪問 操作也被成為pv原語 p 於dutch proberen 測試 v 於 dutch verhogen 增加 而普通整型變數則...