Python多任务(3.线程--多线程共享全局变量,利用同步解决资源竞争,利用互斥锁)
1. 線程之間是共享全局變量的
? ? 驗證代碼:
import threading import time# 定義一個全局變量 g_num = 100def test1(): # 修改g_num的值global g_numg_num += 1print("-----in test1 g_num=%d-----"%g_num)def test2(): # 打印g_numprint("-----in test2 g_num=%d-----"%g_num)def main():t1 = threading.Thread(target=test1)t2 = threading.Thread(target=test2)t1.start()time.sleep(1)t2.start()time.sleep(1)print("-----in main Thread g_num = %d-----"% g_num)if __name__ == '__main__':main()? ??結果為:? ?可以看到在test1函數中利用子線程修改了值,在test2中和主函數中也會改變
? ? ? ? ? ??-----in test1 g_num=101-----
? ? ? ? ? ? ?-----in test2 g_num=101-----
? ? ? ? ? ? -----in main Thread g_num = 101-----
?2.共享全局變量的問題:----->會產生資源競爭的問題
? ? 利用線程同步的互斥鎖來解決
? ? (1) 同步: 同步就是協同步調,按預定的先后次序進行運行。
? ? ? ? ?“同”:? 不是一起動作,而是指協同、協助、互相配合。
? ? ? ? ? 如進程、線程同步,可理解為進程或線程A和B一塊配合執行,A執行到一定程度時要依靠B的某個結果,于是停下? ? ? ? ? ? ? ? 來,示意B運行,再將結果給A,A再執行
(2)互斥鎖:? 當多個線程幾乎同時修改某一個共享數據的時候,需要進行同步控制
? ? ? ? ? ?互斥鎖為資源引入一個狀態: 鎖定/非鎖定
? ? ? ? ? ? 可以這樣理解:? ?
? ? ? ? ? ? ? ? ? 某個線程要更改共享數據時,先將其鎖定,此時資源的狀態為“鎖定”,其他線程不能更改,直到該線程釋放 資? ? ? ? ? ? ? ? 源,將資源的狀態變成“非鎖定”,其他的線程才能再次鎖定該資源。
? (3)? 創建互斥鎖(threading模塊中定義Lock類,可以方便的處理鎖定):
? ? ? ? ? ? mutex = threading.Lock()? ? ? ? #? ?創建? ? ?
? ? ? ? ? ? mutex.acquire()? ? ? ? ? ? ? ? ? ? ? #? ?鎖定? ? ? ? (上鎖)
? ? ? ? ? ? ?mutex.release()? ? ? ? ? ? ? ? ? ? ? #? 釋放? ? ? ? ?(解鎖)
? ? ? ? ?同一把鎖只能上一次,創建后默認是沒有上鎖的狀態,那么acquire()不會堵塞,如果已經被其他線程上了鎖,那么? ? ? ? ? ? ?此?時acquire()就會堵塞,直到這個鎖被解鎖為止。
如下例子:
? ?(1)? 沒加鎖之前,進行一個加法運算,會發現結果不對,,沒加鎖之前運行的結果是
-----in test1 number=1084914----- -----in test2 number=1156328----- -----in main number=1156328-----? ?(2)加上鎖之后,隨便運行結果都是正確的:
-----in test1 number=1000000----- -----in test2 number=2000000----- -----in main number=2000000-----? ?加上鎖之后的代碼?
import threading import time# 定義一個全局變量 number = 0'''創建一個互斥鎖,默認是沒有上鎖的''' mutex = threading.Lock()def test1(temp):global number'''上鎖'''mutex.acquire()for i in range(temp):number += 1'''解鎖'''mutex.release()print("-----in test1 number=%s-----" % number)def test2(temp):global number'''上鎖'''mutex.acquire()for i in range(temp):number += 1'''解鎖'''mutex.release()print("-----in test2 number=%s-----" % number)def main():t1 = threading.Thread(target=test1,args=(1000000,)) # 加上要傳遞的參數,元組類型t2 = threading.Thread(target=test2, args=(1000000,))t1.start()t2.start()time.sleep(2)print("-----in main number=%s-----"% number)if __name__ == '__main__':main()?
總結
以上是生活随笔為你收集整理的Python多任务(3.线程--多线程共享全局变量,利用同步解决资源竞争,利用互斥锁)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python多任务(多线程执行带有参数的
- 下一篇: Python多任务(4.多线程--Pyt