標籤:修改 通訊 join() 使用 說明 run 沒有 rgs release
一:線程
線程(有時候稱為輕量級進程),線程包括開始、執行順序和結束三部分。它有一個指令指標,用於記錄當前啟動並執行上下文。當其他線程運行時,它可以被搶佔(中斷)和臨時掛起(也稱為睡眠)--這種做法叫做讓步
一個進程中的各個線程與主線程共用同一片資料空間,因此相比與獨立的進程而言,線程間的資訊共用和通訊更加容易。線程一般是以並發方式執行的,正是由於這種並行和資料共用機制,使得多任務間的協作成為可能。當然,在單核CPU系統中,因為真正的並發是不可能的,所以線程的執行實際上是這樣規劃的:每個線程運行一小會兒,然後讓步給其他線程(再次排隊等待更多的CPU時間)。在整個進程的執行的過程中,每個線程執行他自己特定任務,在必要時和其他線程進行結果通訊。
當然,這種共用並不是沒有風險的。如果兩個或多個線程訪問同一片資料,由於資料訪問順序不同,可能導致結果不一致,這種情況通常稱為競態條件。
另外,線程無法給予公平的執行時間。
儘管python解譯器中可以運行多個線程,但是在任意給定時刻只有一個線程會被解譯器執行
二:使用線程的第一種方式:
1 import time2 from threading import Thread3 4 def test():5 print(‘-----多線程-------‘)6 time.sleep(1)7 for i in range(5):8 t = Thread(target=test) #建立一個線程,參數是要執行的函數9 t.start() #啟動線程
t.join()# 保證等待子線程運行完再執行後續的主線程
三:使用線程的第二種方式:
1 #使用多線程的第二種方式(建立一個類繼承Thread類,重寫run()方法) 2 import threading 3 import time 4 class MyThread(threading.Thread): 5 def run(self): 6 for i in range(5): 7 print(‘-----使用多線程的第二種方式------‘) 8 time.sleep(1) 9 if __name__ == ‘__main__‘:10 m = MyThread()11 m.start()
四:加互斥鎖解決多線程之間共用資料被修改出現的異常資料
說明:
當多個線程幾乎同時訪問一個共用資料時,需要進行同步控制
線程同步能夠保證多個安全執行緒訪問競爭資源,最簡單的同步機制就是引入互斥鎖。
互斥鎖為資源引入一個狀態:鎖定/非鎖定
某個線程要更改共用資料時,先將其鎖定,此時資源的狀態為”鎖定“,其他線程不能更改;直到改線程釋放資源,將資源狀態變成”非鎖定“,其他線程才能再次鎖定改資源,互斥鎖保證了每次只有線程進行寫入操作,從而保證了多線程情況下資料的準確性。
範例程式碼:
1 from threading import Thread,Lock 2 num = 0 3 def test1(lock): 4 global num 5 lock.acquire() #上鎖 6 for i in range(1000000): 7 num += 1 8 lock.release() #釋放鎖(解鎖) 9 print(‘----test1---%d‘%num)10 def test2(lock):11 global num12 lock.acquire()13 for i in range(1000000):14 num += 115 lock.release()16 print(‘-----test2-----%d‘%num)17 def main():18 lock =Lock()#初始化一個互斥鎖對象19 t1 = Thread(target=test1,args=(lock,)) #建立一個多線程20 t1.start()21 t1.join()22 t2 = Thread(target=test2,args=(lock,))23 t2.start()24 t2.join()#等待子線程執行完成後再繼續主線程25 print(num)26 27 if __name__ == ‘__main__‘:28 main()
運行結果:
----test1---1000000-----test2-----20000002000000
python之多線程