- 互斥鎖Mutex的使用
多個線程處理共享數據,數據會出現問題:
2.7之前每100指令切換一次GIL鎖,線程就會sleep,線程
會把前100條
處理指令存放在CPU緩存內,切換GIL鎖后放入另
外一個線程再次處理同一
條共享數據,如果我這條共享數據需要
101條指令才能處理完,那么這塊數
據結果就會出現問題,當所
有執行線程輪一邊后在回來,CPU會取出第一
次
緩存區的數據,
執行第一條數據的101條指令,結果會覆蓋掉共享數據,
所以的
出的結果並不是我們想得到的。
決上述問題,我們就要使用“互斥鎖”:
互斥鎖:保證鎖定同一個線程,修改這個完整的數據,是用戶
程序自己
的鎖。
使用情況:因為使用時暫用時間,影響其他線程等待,所以盡量
修改處
理塊的數據后立即釋放鎖。
互斥鎖模擬
import threading,time def run(n): # 獲取一把鎖 lock.acquire() # 設置全局變量 global num num += 1 # 釋放一把鎖 lock.release() # 互斥鎖實例化 lock = threading.Lock() num = 0 # 循環50次 for i in range(50): # 生成一個線程實例target=目標,args=參數 t = threading.Thread(target=run,args=("t-%s"%i,)) # 啟動線程 調用run t.start() # 執行結果添加到列表 t_objs.append(t) print("num",num)
注意:只能在python2版本生效,python3,自動加鎖,Ubuntu內可以測試成功。