簡體   English   中英

Windows上的Python多處理RuntimeError

[英]Python Multiprocessing RuntimeError on Windows

我有一個類函數(讓我們稱之為“alpha.py”),它使用多處理(processes = 2)來分叉一個進程,並且是我編寫的Python包的一部分。 在一個單獨的Python腳本中(我們稱之為“beta.py”),我從這個類中實例化了一個對象並調用了使用多處理的相應函數。 最后,所有這些都包含在一個包裝Python腳本(讓我們稱之為“gamma.py”)中,它處理許多不同的類對象和函數。

實質上:

  1. 從命令行運行./gamma.py
  2. gamma.py使用子進程並執行beta.py.
  3. beta.py從alpha.py類中實例化一個對象並調用使用多處理的函數(processes = 2)

這在Mac或Linux上運行沒有問題。 但是,它在Windows機器上成為一個問題,錯誤(和文檔)表明我應該在某處寫這個:

if __name__ == '__main__':
    freeze_support()

這篇文章還提到做同樣的事情。

但是,我不確切知道這兩行應該駐留在哪里。 目前,alpha.py,beta.py或gamma.py都不包含if __name__ == '__main__':部分。 如果有人能告訴我這兩條線應該去哪里以及它背后的基本原理,那將是很棒的。

實際上,這里不需要freeze_support() 您會收到RuntimeError因為您在beta模塊的頂層創建並啟動了新流程。

當在Windows上使用multiprocessing處理創建新進程時,將在此進程中啟動一個新的Python解釋器,它將嘗試使用應執行的目標函數導入該模塊。 這是您的beta模塊。 現在,當您導入它時,應執行所有頂級語句,這將導致創建新流程並再次啟動。 然后,遞歸地,來自該過程的另一個過程,依此類推。

這很可能不是您想要的,因此當您使用subprocess進程直接運行beta.py時,應該初始化新進程並僅啟動一次。

if __name__ == '__main__':應該放在beta.py中,然后在本節中移動初始化並啟動新進程的代碼。 之后,當導入beta.py而不直接運行時,將不會啟動任何新進程,您將看不到任何副作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM