python的鎖

查了好多資料都沒有看太明白,屢次嘗試後終於有些明白了,python中,鎖的意義。python

import threading,time,random
sumresult = 0
class SUM(threading.Thread):
    def run(self):
        global sumresult
        for i in range(5):
            time.sleep(random.randint(50,100)/100.0)
            sumresult+=1
            print sumresult
for i in range(100):
    SUM().start()

執行上面代碼,會發現,sumresult的最終結果常常不會是500,而是49八、499,就是由於運行過程當中,出現了兩個線程同時改寫sumresult值的狀況。多線程

鎖,在多線程時,保證同一時刻只有一個線程能夠訪問共享的資源,從而保證線程間的數據同步。
當某線程須要更改共享數據時,咱們此時申請一把鎖.acquire(),將其鎖定,其餘線程若是須要訪問此數據,就會進入等待的狀態,直到鎖打開.release()爲止。
咱們稍微改寫代碼,在進行復制操做時申請鎖,完成後把鎖釋放dom

import threading,time,random
sumresult = 0
lock=threading.Lock()
class SUM(threading.Thread):
    def run(self):
        global sumresult
        for i in range(5):
            time.sleep(random.randint(50,100)/100.0)
            lock.acquire()
            sumresult+=1
            lock.release()
            print sumresult
for i in range(100):
    SUM().start()

就會獲得正確的結果。
你也許還會發現,程序的運行時間變長了,由於爲了保證同步,有些線程須要等待鎖的釋放。因此爲了保證效率,要把佔用鎖的時間儘可能縮短。ui

另外還須要注意的是,鎖須要是同一把,才能保證同步!線程

相關文章
相關標籤/搜索