首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Python 多進程 `AssertionError: __main__` 卡死?Windows 下務必加 `if __name__ == '__main__':` 保護進程入口

     編輯:程式設計綜合問答

現象:Win10 + Python 2.7 + `multiprocessing`,運行專案卡在 `forking.py` 斷言錯誤:

AssertionError: __main__

根因

Windows **無 `fork` 系統呼叫**,`multiprocessing` 採用 **`spawn`** 機制:重新匯入主模組啟動子進程。若主模組頂層代碼直接執行 `Process(...).start()`,**子進程再次匯入主模組 → 再次執行頂層代碼 → 無限遞歸生成子進程 → 爆炸**。

強制規範:所有進程入口必須包在 `if __name__ == '__main__':`

# main.py
from multiprocessing import Process

def worker():
    print("子進程工作中...")

if __name__ == '__main__':   # <--- 關鍵保護
    p = Process(target=worker)
    p.start()
    p.join()
  • Linux/macOS 預設 `fork`,子進程複製父進程記憶體,**不重新執行頂層代碼**,故不加也能跑,但**不可移植**。
  • Python 3.8+ Windows 預設改為 `spawn`,更嚴格要求此寫法。

常見坑點

  • 在 Jupyter Notebook / 交互式環境執行多進程 → `__name__` 不等於 `'__main__'`,需用 `multiprocessing.freeze_support()` 或改寫腳本檔運行。
  • 打包成 exe (PyInstaller/cx_Freeze) 必須加 `freeze_support()` 在 `if __name__ == '__main__':` 內第一行。
  • 模組被 `import` 時不應有副作用 (啟動進程、連資料庫、綁端口),全部封裝在函數/類中。

參考修復:CSDN 同款問題解決

口訣:**Windows 下 `multiprocessing` 沒有 `if __name__ == '__main__':` 等於自殺。**

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved