您好,登錄后才能下訂單哦!
這篇文章主要介紹了python使用多線程的方法,具有一定借鑒價值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。
多線程(英語:multithreading),是指從軟件或者硬件上實現(xiàn)多個線程并發(fā)執(zhí)行的技術(shù)。具有多線程能力的計算機因有硬件支持而能夠在同一時間執(zhí)行多于一個線程,進而提升整體處理性能。具有這種能力的系統(tǒng)包括對稱多處理機、多核心處理器以及芯片級多處理(Chip-level multithreading)或同時多線程(Simultaneous multithreading)處理器。在一個程序中,這些獨立運行的程序片段叫作“線程”(Thread),利用它編程的概念就叫作“多線程處理(Multithreading)”。具有多線程能力的計算機因有硬件支持而能夠在同一時間執(zhí)行多于一個線程(臺灣譯作“執(zhí)行緒”),進而提升整體處理性能。
Python 多線程之使用方法
Python 提供多線程編程的模塊有以下幾個:
- _thread
- threading
- Queue
- multiprocessing
下面一一介紹:
1. _thread 模塊提供了低級別的基本功能來支持多線程功能,提供簡單的鎖來確保同步,推薦使用 threading 模塊。
2. threading 模塊對 _thread 進行了封裝,提供了更高級別,功能更強,更易于使用的線程管理的功能,對線程的支持更為完善,絕大多數(shù)情況下,只需要使用 threading 這個高級模塊就夠了。
使用 threading 進行多線程操作:
方法一:是創(chuàng)建 threading.Thread 實例,調(diào)用其 start() 方法。
import time import threading def task_thread(counter): print(f'線程名稱:{threading.current_thread().name} 參數(shù):{counter} 開始時間:{time.strftime("%Y-%m-%d %H:%M:%S")}') num = counter while num: time.sleep(3) num -= 1 print(f'線程名稱:{threading.current_thread().name} 參數(shù):{counter} 結(jié)束時間:{time.strftime("%Y-%m-%d %H:%M:%S")}') if __name__ == '__main__': print(f'主線程開始時間:{time.strftime("%Y-%m-%d %H:%M:%S")}') #初始化3個線程,傳遞不同的參數(shù) t1 = threading.Thread(target=task_thread, args=(3,)) t2 = threading.Thread(target=task_thread, args=(2,)) t3 = threading.Thread(target=task_thread, args=(1,)) #開啟三個線程 t1.start() t2.start() t3.start() #等待運行結(jié)束 t1.join() t2.join() t3.join() print(f'主線程結(jié)束時間:{time.strftime("%Y-%m-%d %H:%M:%S")}')
運行結(jié)果如下所示:
主線程開始時間:2018-07-06 23:03:46 線程名稱:Thread-1 參數(shù):3 開始時間:2018-07-06 23:03:46 線程名稱:Thread-2 參數(shù):2 開始時間:2018-07-06 23:03:46 線程名稱:Thread-3 參數(shù):1 開始時間:2018-07-06 23:03:46 線程名稱:Thread-3 參數(shù):1 結(jié)束時間:2018-07-06 23:03:49 線程名稱:Thread-2 參數(shù):2 結(jié)束時間:2018-07-06 23:03:52 線程名稱:Thread-1 參數(shù):3 結(jié)束時間:2018-07-06 23:03:55 主線程結(jié)束時間:2018-07-06 23:03:55
方法二:繼承 Thread 類,在子類中重寫 run() 和 init() 方法。
import time import threading class MyThread(threading.Thread): def __init__(self, counter): super().__init__() self.counter = counter def run(self): print( f'線程名稱:{threading.current_thread().name} 參數(shù):{self.counter} 開始時間:{time.strftime ("%Y-%m-%d %H:%M:%S")}' ) counter = self.counter while counter: time.sleep(3) counter -= 1 print( f'線程名稱:{threading.current_thread().name} 參數(shù):{self.counter} 結(jié)束時間:{time.strftime ("%Y-%m-%d %H:%M:%S")}' ) if __name__ == "__main__": print(f'主線程開始時間:{time.strftime("%Y-%m-%d %H:%M:%S")}') # 初始化3個線程,傳遞不同的參數(shù) t1 = MyThread(3) t2 = MyThread(2) t3 = MyThread(1) # 開啟三個線程 t1.start() t2.start() t3.start() # 等待運行結(jié)束 t1.join() t2.join() t3.join() print(f'主線程結(jié)束時間:{time.strftime("%Y-%m-%d %H:%M:%S")}')
運行結(jié)果如下,與方法一的運行結(jié)果一致。
主線程開始時間:2018-07-06 23:34:16 線程名稱:Thread-1 參數(shù):3 開始時間:2018-07-06 23:34:16 線程名稱:Thread-2 參數(shù):2 開始時間:2018-07-06 23:34:16 線程名稱:Thread-3 參數(shù):1 開始時間:2018-07-06 23:34:16 線程名稱:Thread-3 參數(shù):1 結(jié)束時間:2018-07-06 23:34:19 線程名稱:Thread-2 參數(shù):2 結(jié)束時間:2018-07-06 23:34:22 線程名稱:Thread-1 參數(shù):3 結(jié)束時間:2018-07-06 23:34:25 主線程結(jié)束時間:2018-07-06 23:34:25
如果繼承 Thread 類,想調(diào)用外部傳入函數(shù),代碼如下所示:
import time import threading def task_thread(counter): print(f'線程名稱:{threading.current_thread().name} 參數(shù):{counter} 開始時間:{time.strftime("%Y-%m-%d %H:%M:%S")}') num = counter while num: time.sleep(3) num -= 1 print(f'線程名稱:{threading.current_thread().name} 參數(shù):{counter} 結(jié)束時間:{time.strftime("%Y-%m-%d %H:%M:%S")}') class MyThread(threading.Thread): def __init__(self, target, args): super().__init__() self.target = target self.args = args def run(self): self.target(*self.args) if __name__ == "__main__": print(f'主線程開始時間:{time.strftime("%Y-%m-%d %H:%M:%S")}') # 初始化3個線程,傳遞不同的參數(shù) t1 = MyThread(target=task_thread,args=(3,)) t2 = MyThread(target=task_thread,args=(2,)) t3 = MyThread(target=task_thread,args=(1,)) # 開啟三個線程 t1.start() t2.start() t3.start() # 等待運行結(jié)束 t1.join() t2.join() t3.join() print(f'主線程結(jié)束時間:{time.strftime("%Y-%m-%d %H:%M:%S")}')
這樣就和方法一是相通的,實例化自定義的線程類,運行結(jié)果不變。
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享python使用多線程的方法內(nèi)容對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,遇到問題就找億速云,詳細(xì)的解決方法等著你來學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。