本文實例講述了Python多線程原理與用法。分享給大家供大家參考,具體如下:
多線程(英語:multithreading),是指從軟件或者硬件上實現多個線程并發執行的技術。具有多線程能力的計算機因有硬件支持而能夠在同一時間執行多于一個線程,進而提升整體處理性能。具有這種能力的系統包括對稱多處理機、多核心處理器以及芯片級多處理(Chip-level multithreading)或同時多線程(Simultaneous multithreading)處理器。[1] 在一個程序中,這些獨立運行的程序片段叫作“線程”(Thread),利用它編程的概念就叫作“多線程處理(Multithreading)”。具有多線程能力的計算機因有硬件支持而能夠在同一時間執行多于一個線程(臺灣譯作“執行緒”),進而提升整體處理性能。
創建并啟動一個線程
import threadingdef runtask(name): print("%s線程已啟動"%name)t = threading.Thread(target=runtask,args=("task1",)) # args因為是一個元組,所以必須這樣寫,否則運行將報錯t.start()
join
等待當前線程執行完畢
import threadingimport timedef runtask(name): print("%s線程已啟動"%name) time.sleep(2)t = threading.Thread(target=runtask,args=("task1",))t.start()t.join()print("abc") # 過了2s才會打印,若無等待將看不到等待2s的效果
setDaemon(True)
將線程設置為守護線程。若設置為守護線程,主線程結束后,子線程也將結束,并且主線程不會理會子線程是否結束,主線程不會等待子線程結束完后才結束。若沒有設置為守護線程,主線程會等待子線程結束后才會結束。
active_count
程序的線程數量,數量=主線程+子線程數量
Lock(互斥鎖)
Python編程中,引入了對象互斥鎖的概念,來保證共享數據操作的完整性。每個對象都對應于一個可稱為” 互斥鎖” 的標記,這個標記用來保證在任一時刻,只能有一個線程訪問該對象。在Python中我們使用threading模塊提供的Lock類。
import threading,timedef runtask(name): global count time.sleep(1) lock.acquire() # 獲取鎖資源,并返回是否獲取成功 count+=1 print(name,count) lock.release() # 釋放資源count = 0lock = threading.Lock() # 互斥鎖for index in range(50): t = threading.Thread(target=runtask,args=("thread%d"%index,)) t.start()
上面這段代碼如果沒有加上互斥鎖,在Python2.x中執行的結果將會是亂的。在Python3.x中執行卻總是正確的,似乎是自動為其加了鎖
RLock(遞歸鎖,可重入鎖)
當一個線程中遇到鎖嵌套情況該怎么辦,又會遇到什么情況?
def run1(): global count1 lock.acquire() count1 += 1 lock.release() return count1def run2(): global count2 lock.acquire() count2 += 1 lock.release() return count2def runtask(): lock.acquire() r1 = run1() print("="*30) r2 = run2() lock.release() print(r1,r2)count1,count2 = 0,0lock = threading.Lock()for index in range(50): t = threading.Thread(target=runtask,) t.start()
新聞熱點
疑難解答