1. 程式人生 > >python之執行緒鎖與訊號量

python之執行緒鎖與訊號量

執行緒鎖(互斥鎖Mutex)

一個程序下可以啟動多個執行緒,多個執行緒共享父程序的記憶體空間,也就意味著每個執行緒可以訪問同一份資料,此時,如果2個執行緒同時要修改同一份資料,會出現什麼狀況?就會可能存在同時取出了一個數據進行操作,然後存回去,這樣就會丟失一次操作。所以用鎖,在修改之前鎖上資料,修改之後再釋放鎖,期間別人不能使用這個資料。

例子:

import threading

num = 0  #全域性變數
lock = threading.Lock()  #生成全域性鎖
def add():
    global num  # 在每個執行緒中都獲取這個全域性變數
    lock.acquire()  # 修改資料前加鎖
    num += 1  # 對此公共變數進行+1操作
    lock.release()  # 修改後釋放

thread_list = []
for i in range(100):
    t = threading.Thread(target=add)
    t.start()
    thread_list.append(t)

for t in thread_list:  # 等待所有執行緒執行完畢
    t.join()

print('final num:', num)

執行緒鎖只允許同一時刻一個執行緒修改變數,如果要在同一時刻允許多個執行緒修改變數,用訊號量。

 

訊號量Semaphore

執行緒鎖同時只允許一個執行緒更改資料,而訊號量是同時允許一定數量的執行緒更改資料 。

import threading, time
#訊號量

def run(n):
    semaphore.acquire()
    time.sleep(1)   #控制每個執行緒1秒執行時間
    print("run the thread: %s\n" % n)
    semaphore.release()

semaphore = threading.BoundedSemaphore(3)  # 最多允許5個執行緒同時執行
for i in range(20):
    t = threading.Thread(target=run, args=(i,))
    t.start()

while threading.active_count() != 1:    #還有執行緒在活動就不結束
    pass
else:
    print('----all threads done---')