1. 前言
Python 是一種用途廣泛的程式語言,特別在數據處理、機器學習和網頁開發領域提供了強大的工具。其中,multiprocessing 模組 是實現並行處理的重要函式庫。本文將從基礎到進階,詳細介紹 Python multiprocessing 模組的使用方法,並透過視覺化輔助說明,分享提升效能的實用技巧。
2. 什麼是 multiprocessing?
2.1 為何需要並行處理?
Python 預設為單執行緒運行,但當處理大型數據或執行複雜計算時,單執行緒的方式會受到速度限制。透過並行處理,可以同時執行多個任務,有效利用 CPU 的所有核心,進而縮短處理時間。multiprocessing 模組 能夠避開 Python 的 GIL(全域直譯器鎖),使多個進程能夠真正進行並行計算。
2.2 與單執行緒的差異
在單執行緒環境中,一個進程只能逐步執行任務,而多進程則能夠同時處理多個任務。這在 CPU 密集型工作(如大量數據計算、資料分析)時,能顯著提升效能。
3. multiprocessing 模組的基本語法
3.1 Process 類別的使用方法
multiprocessing
模組的基礎是Process 類別,透過它可以輕鬆建立新的進程並執行並行處理。
import multiprocessing
def worker_function():
print("新進程已執行")
if __name__ == "__main__":
process = multiprocessing.Process(target=worker_function)
process.start()
process.join()
在這段程式碼中,worker_function
會在新的進程中執行。使用 start()
方法啟動進程,並透過 join()
方法等待進程執行完成。
3.2 傳遞參數給進程的方法
要向進程傳遞參數,可以使用 args
參數。以下範例中,worker
函式會接收參數並執行。
def worker(number):
print(f'Worker {number} 已執行')
if __name__ == "__main__":
process = multiprocessing.Process(target=worker, args=(5,))
process.start()
process.join()
透過這種方式,可以將動態數據傳遞給進程,實現並行處理。
4. 資料共享與同步
4.1 使用共享記憶體進行資料共享
在多進程環境中,為了讓多個進程能夠安全地共享數據,可以使用 Value 和 Array。這些共享記憶體對象可以確保即使多個進程同時存取,也能安全地操作數據。
import multiprocessing
def increment_value(shared_value):
with shared_value.get_lock():
shared_value.value += 1
if __name__ == "__main__":
shared_value = multiprocessing.Value('i', 0)
processes = [multiprocessing.Process(target=increment_value, args=(shared_value,)) for _ in range(5)]
for process in processes:
process.start()
for process in processes:
process.join()
print(f'最終數值: {shared_value.value}')
在這個範例中,5 個進程同時增加共享記憶體內的整數值。我們使用 get_lock()
來避免競爭條件(race condition)。
4.2 使用鎖機制防止數據競爭
當多個進程同時存取同一份數據時,可能會發生數據競爭問題。使用鎖機制(Lock),可以確保多個進程不會同時修改數據,從而避免競爭條件。

5. 使用進程池 (Process Pool) 分配任務
5.1 善用 Pool 類別
使用 Pool
類別,可以將多個任務拆分並讓多個進程同時執行。這在處理大量數據或需要分配任務時非常有用。
from multiprocessing import Pool
def square(x):
return x * x
if __name__ == "__main__":
with Pool(4) as pool:
results = pool.map(square, range(10))
print(results)
在這段程式碼中,每個數值都會被平方,並分配給 4 個進程並行計算。透過 map()
方法,可以輕鬆地將任務分配給不同的進程執行。
示意圖:使用 Pool 類別進行任務分配

5.2 進階應用:使用 starmap 處理多個參數
透過 starmap()
方法,可以對擁有多個參數的函式進行並行處理。例如,下面的範例中,每個進程都會接收兩個數值並進行計算:
def multiply(x, y):
return x * y
if __name__ == "__main__":
with Pool(4) as pool:
results = pool.starmap(multiply, [(1, 2), (3, 4), (5, 6), (7, 8)])
print(results)
6. 最佳化 CPU 資源的利用
6.1 使用 cpu_count()
來最佳化進程數量
Python 的 multiprocessing.cpu_count()
方法可以自動獲取系統的 CPU 核心數,並根據此資訊來決定進程數量,避免創建過多的進程影響效能。
from multiprocessing import Pool, cpu_count
if __name__ == "__main__":
with Pool(cpu_count() - 1) as pool:
results = pool.map(square, range(100))
print(results)
6.2 高效利用系統資源
為了避免佔用過多系統資源,通常會保留一個 CPU 核心給系統使用,確保其他應用程式不會受到影響。
7. 實際應用案例與最佳實踐
7.1 實際應用案例
multiprocessing 模組在以下情境中特別有用:
- 大規模數據處理:同時讀取與處理多個文件,提高運行效率。
- 機器學習並行訓練:同時運行多個模型的訓練過程,縮短時間。
- 網頁爬取 (Web Crawling):並行爬取多個網頁,提高爬取速度。
7.2 最佳實踐
- 最佳化資源分配:根據系統的 CPU 核心數合理設定進程數量。
- 使用日誌記錄 (Logging):透過
logging
模組追蹤每個進程的狀態,以便偵錯與監控。
import logging
import multiprocessing
def worker_function():
logging.info(f'進程 {multiprocessing.current_process().name} 已啟動')
if __name__ == "__main__":
logging.basicConfig(level=logging.INFO)
process = multiprocessing.Process(target=worker_function, name='工作進程1')
process.start()
process.join()
- 錯誤處理:由於多個進程可能同時執行,適當的錯誤處理機制至關重要。應使用
try-except
來確保異常發生時不影響其他進程或主進程。

8. 總結
在本文中,我們深入探討了如何使用 Python 的 multiprocessing 模組來實現高效的並行處理。我們學習了 Process 類別 的基本使用方式,數據共享與同步 的方法,以及 進程池 (Process Pool) 來分配任務。此外,我們還探討了最佳化 CPU 資源使用的技巧,並介紹了一些實際應用案例。
透過正確使用並行處理技術,可以顯著提高數據處理、機器學習、網頁爬取等場景的效能。multiprocessing 模組是一個強大且靈活的工具,能幫助 Python 開發者最大化利用系統資源。
希望這篇文章能夠幫助你更好地理解並活用 multiprocessing,並應用在日常開發工作中!