1. 程式人生 > >Python3-為多執行緒上鎖

Python3-為多執行緒上鎖

#在threading模組當中,定義一個Lock類,可以方便的處理鎖定:(執行緒之間的鎖是互斥的)
#互斥鎖
'''
當多個執行緒幾乎同時修改某一個共享資料的時候,需要進行同步控制。
執行緒同步能夠保證多個執行緒安全訪問“競爭資源”,最簡單的同步機制就是引用互斥鎖。
互斥鎖為資源引入一個狀態:鎖定/非鎖定狀態。
某個執行緒要更改共享資料時,先將其鎖定,此時資源的狀態為“鎖定”,其它執行緒不能更改;
直到當前執行緒釋放資源,將資源變成"非鎖定"狀態,其它的執行緒才能再次鎖定該資源。
互斥鎖保證了每次只有一個執行緒進行“寫操作”,從而保證多個執行緒資料正確性。
'''
#上鎖/解鎖過程
'''
當一個執行緒呼叫鎖的acquire()方法獲取鎖時,鎖就進行“鎖定(Locked)”狀態。
每次只有一個執行緒可以獲得這個鎖。如果此時另一個執行緒試圖獲取鎖中的資源,該執行緒就會變為“阻塞”狀態。
直到擁有鎖的那個執行緒執行release(),鎖就變成“非鎖定(Unlocked)”狀態。
執行緒除錯程式從處於同步阻塞狀態的執行緒中選擇一個來獲得鎖,並使得該執行緒進入“執行(running)”狀態。
'''
# #1、建立鎖 # mutex = threading.Lock() # # #2.鎖定 # mutex.acquire(True/Flase) ''' True:如果所要獲取的資源已經“鎖定”,表示當前執行緒處地等待(阻塞),直到獲取到這個鎖為止--預設值 False:不阻塞,即不管本次呼叫能夠成功上鎖,都不會卡在這,而是繼續執行後面的程式碼。 ''' # # #3.解鎖 # mutex.release()
from threading import Lockfrom threading import Threadimport time#全域性變數g_num=0def w1(): global
g_num for i in range(1000000): m_flag=m.acquire(True)#判斷是否上鎖,上了鎖才可以執行並解鎖if m_flag: g_num+=1m.release() print("w1---g_num=%d" % g_num)def w2(): global g_num for i in range(1000000): m_flag=m.acquire(True)#若為False,即不阻塞(不等待),跳過需要枷鎖執行的程式碼,繼續執行下面的程式碼,會出錯
if m_flag: g_num += 1
m.release() print("w2---g_num=%d" % g_num)if __name__ == "__main__": # 建立鎖m = Lock() t1 = Thread(target=w1) t1.start() #time.sleep(1)#如果加入時間阻塞,就不是並行t2 = Thread(target=w2) t2.start()'''#問題產生的原因就是沒有控制多個執行緒對同一資源的訪問,對資料造成破壞,使得執行緒執行的結果不要預期。#這種現象我們稱為“執行緒不安全”解決思路:1.t1被呼叫的時候,獲取g_num =0,然後上一把鎖, 即不允許其它執行緒操作num.2.對num進行加13.解鎖,g_num = 1,其它的執行緒就可以使用g_num的值 ,而且g_num的值不是原來的04.同理其它執行緒在對num進行修改時,都要先上鎖,處理完成後再解鎖。在上鎖的整個過程中,不允許其它執行緒訪問,保證了資料的正確性'''

/Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 /Users/apple/PycharmProjects/stage4/thread/t11.py
w2---g_num=1871349
w1---g_num=2000000


Process finished with exit code 0

========================