multiprocessing.Process 是 Python 跨平台進程創建的核心類,封裝了 fork/spawn/forkserver 三種啟動方式。本文系統講解單進程啟動、進程池並發、進程鏈遞歸、扇形並發、結果收集、異常處理、守護進程、上下文管理等完整知識體系,並給出生產級封裝模式。
| 方式 | 平台 | 特點 |
|---|---|---|
fork | Unix | 快、COW 內存共享、子進程繼承父進程所有內存狀態(含鎖、線程→危險) |
spawn | 全平台 | 慢、全新解釋器、僅繼承必要資源、安全、推薦生產環境 |
forkserver | Unix | 折中:預啟動服務器進程,fork 子進程,避免重複導入開銷 |
List[Any]: return list(self.executor.map(fn, iterable, timeout=timeout)) def submit(self, fn: Callable, *args, **kwargs): return self.executor.submit(fn, *args, **kwargs) def shutdown(self, wait: bool = True): self.executor.shutdown(wait=wait) def __enter__(self): return self def __exit__(self, *exc): self.shutdown() return False # 使用 with TaskRunner(4) as runner: futures = [runner.submit(lambda x: x**2, i) for i in range(10)] for f in futures: print(f.result())
| 坑點 | 解決 |
|---|---|
Windows 下無 if __name__ == '__main__' 導致遞歸創建 | 入口腳本必須守護 |
| fork 方式下線程/鎖繼承導致死鎖 | 強制 set_start_method('spawn') |
| 大對象傳參序列化開銷大 | 用共享內存 SharedMemory (3.8+) 或 Manager 代理 |
| 異常在子進程中丟失 | 包裝器捕獲並重新拋出,或用 concurrent.futures Future.result() |
| 僵屍進程 | 始終調用 join() 或 Pool.close()/join() |
multiprocessing.Process 及其高層抽象 Pool/ProcessPoolExecutor 為 Python 提供了真正的並行計算能力(繞過 GIL)。掌握啟動方式選擇、同步原語、結果收集、異常處理、資源清理,能構建高性能、穩健的多進程系統。現代代碼優先使用 ProcessPoolExecutor + spawn 上下文,配合類型提示與上下文管理器,獲得最佳開發體驗與運行時安全。