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文章
19407瀏覽量
231183 -
cpu
+關注
關注
68文章
10902瀏覽量
213013 -
函數
+關注
關注
3文章
4346瀏覽量
62971 -
python
+關注
關注
56文章
4807瀏覽量
85037 -
多進程
+關注
關注
0文章
14瀏覽量
2632
原文標題:Python多進程學習
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
實驗:編寫多進程程序
多線程和多進程的區別
淺談多進程多線程的選擇
python多線程和多進程對比
進程控制開發之編寫多進程程序實驗解析
![<b class='flag-5'>進程</b>控制開發之編寫<b class='flag-5'>多進程</b>程序實驗解析](https://file.elecfans.com/web2/M00/4A/11/pYYBAGKhvJKAHnHVAAAxbQ1R4GM076.png)
python多線程與多進程的區別
![<b class='flag-5'>python</b>多線程與<b class='flag-5'>多進程</b>的區別](https://file1.elecfans.com//web2/M00/A6/FF/wKgZomUMQbeARf96AABSkZj1Ovg986.png)
如何選好多線程和多進程
![如何選好多線程和<b class='flag-5'>多進程</b>](https://file.elecfans.com/web1/M00/50/9B/pIYBAFr1Ub6AeeozAAAPOPJtzso177.png)
使用Python多進程的理由
![使用<b class='flag-5'>Python</b><b class='flag-5'>多進程</b>的理由](https://file.elecfans.com/web1/M00/B9/35/pIYBAF59vtWAAuWEAAAyVBFUjkg925.png)
淺談Linux網絡編程中的多進程和多線程
![淺談Linux網絡編程中的<b class='flag-5'>多進程</b>和多線程](https://file1.elecfans.com/web2/M00/8F/C5/wKgaomTSAv-AIthnAAZCl1xl1VM169.jpg)
關于Python多進程和多線程詳解
![關于<b class='flag-5'>Python</b><b class='flag-5'>多進程</b>和多線程詳解](https://file1.elecfans.com/web2/M00/AC/AA/wKgaomVIjDiAUs5sAAA8jyooAsM713.png)
shell腳本實現并發多進程
Linux系統上多線程和多進程的運行效率
![Linux系統上多線程和<b class='flag-5'>多進程</b>的運行效率](https://file1.elecfans.com/web2/M00/AD/6A/wKgaomVNmzGARi3NAAH_Fup2hME169.jpg)
你還是分不清多進程和多線程嗎?一文搞懂!
Python中多線程和多進程的區別
![<b class='flag-5'>Python</b>中多線程和<b class='flag-5'>多進程</b>的區別](https://file1.elecfans.com/web2/M00/0A/EF/wKgaomcYcmaAS08XAAAsH7JtzO0544.png)
評論