Python 多進程 (Multiprocessing) 是一種同時利用計算機多個處理器核心 (CPU cores) 進行并行處理的技術,它與 Python 的多線程 (Multithreading) 技術不同,因為多線程的并發任務依賴于一個 GIL (Global Interpreter Lock)。在多進程中,每個進程都有自己的解釋器進程,并且可以同時使用多個 CPU 核心,因此在處理計算密集型任務時比多線程更有效。
要使用 Python 的多進程,我們需要使用內置的 multiprocessing 模塊,該模塊提供了創建和管理進程的類和函數,下面是一個簡單的 Python 多進程的例子:
importmultiprocessing defworker(): """子進程的工作函數""" print("Starting worker") # 這里可以放一些耗時的任務 print("Finished worker") if__name__=='__main__': # 創建一個子進程 p=multiprocessing.Process(target=worker) # 啟動子進程 p.start() # 等待子進程結束 p.join() print("Parent process finished")
在這個例子中,我們定義了一個函數 worker(),這個函數是子進程要執行的任務,我們使用 multiprocessing.Process 類創建了一個子進程,并將 worker() 函數作為參數傳遞給 target 參數,然后我們使用 start() 方法啟動子進程,join() 方法等待子進程完成,最后,主進程會輸出一條消息,表示自己已經完成了。
除了創建單個子進程,我們還可以使用 Pool 類來創建多個子進程,以便并行處理多個任務,下面是一個使用 Pool 類的例子:
importmultiprocessing defworker(num): """子進程的工作函數""" print(f"Starting worker {num}") # 這里可以放一些耗時的任務 print(f"Finished worker {num}") if__name__=='__main__': # 創建一個包含 4 個進程的進程池 withmultiprocessing.Pool(processes=4)aspool: # 使用 map 函數并行執行 worker 函數 pool.map(worker, [1,2,3,4]) print("Parent process finished")
在這個例子中,我們使用 Pool 類創建了一個包含 4 個進程的進程池,然后我們使用 map() 方法并行執行 worker() 函數。map() 方法會將參數列表中的每個參數依次傳遞給 worker() 函數,并將返回值收集到一個列表中。最后,主進程會輸出一條消息,表示自己已經完成了。
當我們需要執行一些計算密集型的任務時,使用 Python 的多進程技術可以顯著提高程序的執行效率,下面是一些使用 Python 的多進程技術的常見場景:
數據處理:當我們需要處理大量的數據時,可以使用多進程技術將數據分成多個部分,并同時處理它們。
網絡爬蟲:當我們需要爬取大量的網頁時,可以使用多進程技術將不同的任務分配給不同的進程,從而并行地執行它們。
圖像處理:當我們需要對大量的圖像進行處理時,可以使用多進程技術并行執行不同的處理任務。
在使用 Python 的多進程技術時,我們需要注意一些問題:
進程間通信:由于每個進程都有自己的內存空間,因此它們之間不能直接共享數據,我們需要使用 multiprocessing 模塊提供的管道、隊列等機制來實現進程間通信。
進程池:在使用 Pool 類時,我們需要注意控制并發任務的數量,以免占用過多的系統資源。
內存限制:由于每個進程都有自己的內存空間,因此如果同時創建太多的進程,會占用過多的系統內存,導致程序崩潰。
下面是一個使用進程池并行執行任務的例子,其中使用了 imap_unordered() 方法來異步執行任務:
importmultiprocessing importtime defsquare(x): """計算平方""" time.sleep(1) # 模擬耗時的計算 returnx*x if__name__=='__main__': # 創建進程池 withmultiprocessing.Pool()aspool: # 異步執行任務 forresultinpool.imap_unordered(square,range(10)): print(result)
在這個例子中,我們創建了一個包含默認進程數的進程池,然后使用 imap_unordered() 方法并行執行 square() 函數。imap_unordered() 方法會返回一個迭代器,每次迭代都會返回一個已經完成的任務的結果。由于我們使用了異步執行,因此任務的返回順序不一定與參數的順序相同。
除了使用 imap_unordered() 方法,我們還可以使用 imap() 方法,它會按照參數的順序返回任務的結果,此外,我們還可以使用 apply() 和 apply_async() 方法來執行單個任務或異步執行單個任務。
總的來說,使用 Python 的多進程技術可以幫助我們更有效地處理計算密集型任務,通過使用 multiprocessing 模塊和 Pool 類,我們可以輕松地創建和管理多個子進程,并使它們并行地執行任務。
審核編輯:湯梓紅
-
處理器
+關注
關注
68文章
18927瀏覽量
227224 -
cpu
+關注
關注
68文章
10702瀏覽量
209358 -
函數
+關注
關注
3文章
4237瀏覽量
61967 -
python
+關注
關注
53文章
4753瀏覽量
84077 -
多進程
+關注
關注
0文章
13瀏覽量
2603
原文標題:Python多進程學習
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論