python執行緒池與多執行緒的區別:1、執行緒在進程下行進;2、執行緒在進程下行進;3、一個行程可以包含多個執行緒;4、不同進程間資料很難共享;5、行程要比執行緒消耗更多的電腦資源。
一. 執行緒與多執行緒
#進程: 一個程式執行時,可以稱之為一個行程,其包含運行中的程序和程式所使用的記憶體和系統資源.一個行程由多個執行緒所組成.
#執行緒: 執行緒是程式中的一個執行流,每個執行緒都有自己的專有暫存器,同時程式碼區是共享的.不同的執行緒可以執行同樣的函數.
多執行緒: 多執行緒是指程式中包含多個執行流,也即是一個程式中可以同時運行多個不同的執行緒來執行不同的任務,允許單一程式創建多個並行執行的執行緒來完成各自的任務.
多執行緒最大的好處: 提高CPU利用率( 尤其適用於I/O密集型程式, 速度提升特別明顯)
進程與執行緒的差異:
做個簡單的比喻:進程=火車,線程=車廂
線程在進程下行進(單純的車廂無法運行)
一個進程可以包含多個線程(一輛火車可以有多個車廂)
不同進程間資料很難共享(一輛火車上的乘客很難換到另外一輛火車,例如站點換乘)
同一進程下不同線程間資料很易共享(A車廂換到B車廂很容易)
進程要比執行緒消耗更多的電腦資源(採用多列火車相比多個車廂更耗資源)
進程間不會互相影響,一個線程掛掉將導致整個進程掛掉(一列火車不會影響到另外一列火車,但是如果一列火車上中間的一節車廂著火了,將影響到所有車廂)
進程可以拓展到多機,進程最多適合多核(不同火車可以開在多個軌道上,同一火車的車廂不能在行進的不同的軌道上)
進程使用的內存地址可以上鎖,即當一個執行緒使用某些共享記憶體時,其他執行緒必須等它結束,才能使用這一塊記憶體。 (例如火車上的洗手間)-"互斥鎖"
進程使用的內存地址可以限定使用量(比如火車上的餐廳,最多只允許多少人進入,如果滿了需要在門口等,等有人出來了才能進去)-「信號量」
二. 多執行緒之threading 類別
threading類別是最常用的多執行緒模組.建立執行緒的方法如下程式碼:
threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
group:預設為None.
target:要執行的函數名稱, 記得不要帶函數的括號.
name:線程名稱,預設為'Thread-N'形式.
args:在參數target中傳入的可呼叫物件的參數元組.
kwargs:在參數target中傳入的可呼叫物件的關鍵字參數字典.
daemon:守護模式屬性,預設為None.
#線程物件的重要方法:
start(): 開啟執行緒.它將使得run()方法在一個獨立的執行緒中被呼叫.
run(): 此方法代表執行緒活動.
join(timeout=None): 讓目前呼叫者執行緒等待,直到執行緒結束.
daemon: 表示該線程是否為守護線程, True或False.
建立多執行緒實例:
import random import threading import time def awesome_function(name): wait_time = random.randint(1, 10) print('current thread name is :{0} and wait {1} s'.format(name, wait_time)) time.sleep(wait_time) print('thread {} finished.'.format(name)) if __name__ == '__main__': for i in range(0, 3): t = threading.Thread(target=awesome_function, args=(i,)) t.start()
可以先看一下我錄製的運行結果:
#上面範例開啟了3個執行緒,3個執行緒並發執行任務,先完成任務的執行緒(time.sleep最短的)先輸出結果.
三. 更好用的執行緒池類別ThreadPoolExecutor
啟動一個新線程的開銷非常大,因為它涉及與操作系統的交互.在這種情況下,使用線程池可以很好地提升程序性能,尤其是當程序中需要創建大量生存期很短暫的線程時更應該考慮使用線程池.
線程池在系統啟動時即創建大量空閒的線程,程序只要將一個函數提交給線程池,線程池就會啟動一個空閒的線程來執行它.當函數執行結束後,該線程並不會死亡,而是再次返回到線程池中變成空閒狀態,等待下一個函數.同時,使用線程池可以有效地控制系統中並發線程的數量.當系統中包含有大量的並發線程時,會導致系統性能急劇下降,甚至導致Python解釋器崩潰,而線程池的最大線程數參數可以控制系統中並發線程的數量不超過此數.
現在主流使用的線程池是concurrent.futures模組中的ThreadPoolExecutor:
import random import time from concurrent.futures import ThreadPoolExecutor def awesome_function(name): wait_time = random.randint(1, 10) print('current thread name is :{0} and wait {1} s'.format(name, wait_time)) time.sleep(wait_time) print('thread {} finished.'.format(name)) if __name__ == '__main__': with ThreadPoolExecutor(max_workers=3) as t: for i in range(0, 3): t.submit(awesome_function, i)
運行結果錄製如下:
創建一個最大容納數量為3的線程池物件,透過submit提交執行的函數到線程池中,若線程池中的某個線程(thread 2)執行完成,則把空閒的執行緒(thread 3)放入到池子中,依次類別推,直到所有執行緒執行完成則程式結束。
以上是python執行緒池與多執行緒的區別的詳細內容。更多資訊請關注PHP中文網其他相關文章!