一、概述
Python進程池是一種用於在Python中創建多個線程並執行並發任務的機制。主線程可以創建一組子線程,將多個任務分發給它們去完成,然後等待它們完成,最後再將所有的結果進行聚合。
與線程池相比,進程池更適合計算密集型任務,並且通常可以使程序性能得到更好的提升。因為進程池中的每個進程都運行在自己的進程空間中,互不干擾。這對於計算密集型任務來說非常適合。
二、進程池基本用法
Python內置了multiprocessing模塊,它提供了一個Pool類來實現進程池的操作。
import multiprocessing as mp
def task(num):
return num * num
if __name__ == "__main__":
pool = mp.Pool()
res = pool.map(task, [1, 2, 3, 4, 5])
print(res)
以上代碼中,首先導入multiprocessing模塊。在task函數中,我們定義了一個簡單的任務(計算輸入值的平方)。
在主程序中,我們創建了一個進程池,並用map()方法將任務分配給進程池中的進程來處理。map()方法將任務列表中的每個元素作為參數傳遞給任務函數,進程池返回一個與任務列表等長的結果列表。
運行該程序,可以得到如下的輸出:
[1, 4, 9, 16, 25]
三、常用進程池方法
1. apply()
apply()方法用於向進程池提交一個任務,並等待任務完成並返回結果。
import multiprocessing as mp
def task(num):
return num * num
if __name__ == "__main__":
pool = mp.Pool()
res = pool.apply(task, args=(5,))
print(res)
以上代碼中,我們用apply()方法向進程池提交了一個任務,並傳入任務函數需要的參數,pool.apply()方法會阻塞進程,直到該任務完成並返回結果。
運行該程序,可以得到如下的輸出:
25
2. apply_async()
apply_async()方法用於向進程池提交一個非同步任務(即無需等待任務完成),將任務加入到進程池的隊列里,並立即返回一個AsyncResult對象。
import multiprocessing as mp
def task(num):
return num * num
if __name__ == "__main__":
pool = mp.Pool()
res = pool.apply_async(task, args=(5,))
print(res.get())
在以上代碼中,我們用apply_async()方法向進程池提交任務,並傳入任務函數需要的參數。apply_async()方法會立即返回一個AsyncResult對象,可以使用.get()方法在需要結果時獲取結果。
運行該程序,可以得到如下的輸出:
25
3. map()
map()方法用於向進程池提交多個任務,並等待所有任務完成並返回結果。
import multiprocessing as mp
def task(num):
return num * num
if __name__ == "__main__":
pool = mp.Pool()
res = pool.map(task, [1, 2, 3, 4, 5])
print(res)
在以上代碼中,我們用map()方法向進程池提交了多個任務,並將任務結果存儲在一個列表中。
運行該程序,可以得到如下的輸出:
[1, 4, 9, 16, 25]
4. map_async()
map_async()方法用於向進程池提交多個非同步任務(即無需等待任務完成),並立即返回一個AsyncResult對象。
import multiprocessing as mp
def task(num):
return num * num
if __name__ == "__main__":
pool = mp.Pool()
res = pool.map_async(task, [1, 2, 3, 4, 5])
print(res.get())
在以上代碼中,我們用map_async()方法向進程池提交了多個非同步任務,並使用.get()方法在需要結果時獲取結果。
運行該程序,可以得到如下的輸出:
[1, 4, 9, 16, 25]
5. close()和join()
close()方法用於向進程池發送一個停止信號,表示不再接受新任務。而join()方法則用於等待進程池中的所有任務完成。
import multiprocessing as mp
def task(num):
return num * num
if __name__ == "__main__":
pool = mp.Pool()
res = pool.map_async(task, [1, 2, 3, 4, 5])
pool.close()
pool.join()
print(res.get())
在以上代碼中,我們用close()方法發送停止信號,並用join()方法等待所有任務完成。
運行該程序,可以得到如下的輸出:
[1, 4, 9, 16, 25]
四、其他注意事項
需要注意的是,當調用進程池的close()方法後,不能再向進程池中提交新的任務,否則會引發異常。此外,在使用進程池時,盡量避免使用全局變數,因為多個進程之間共享全局變數可能會導致不一致的結果。
五、總結
Python進程池是一種用於在Python中實現並發任務的機制。
在Python中,我們可以通過multiprocessing模塊提供的Pool類來實現進程池。
進程池提供了多種方法來處理任務,包括apply()、apply_async()、map()、map_async()等。
在使用進程池時,需要注意不能再向進程池中提交新的任務,否則會引發異常。同時,需要避免使用全局變數,以防止出現不一致的結果。
原創文章,作者:WNHOG,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/333990.html