簡體   English   中英

Python function 中的多處理:將 freeze_support() 放在哪里?

[英]Multiprocessing in a Python function: where to put freeze_support()?

I am trying to use one of the GGS functions in Python 2.7 ( https://github.com/cvxgrp/GGS , the function that I am trying to use is located inside ggs.py and it is called GGSCrossVal, row 72) but Python 向我展示了這個錯誤:

在當前進程完成其引導階段之前嘗試啟動一個新進程。 這可能意味着您在 Windows 上並且您忘記在主模塊中使用正確的習慣用法: if name == ' main ': freeze_support()... 如果程序是,則可以省略“freeze_support()”行不會被凍結以生成 Windows 可執行文件。

我必須把這個命令放在哪里? .

我生成了一個 2x3740 的數據矩陣,數據取自具有一定均值和一定協方差矩陣的雙變量分布(實際上我已經在 MATLAB 中生成它們並在 Python 中導入)並以這種方式調用 function:

trainTestResults = GGSCrossVal(data, 25, [10, 1, 0.1, 0.01, 0.001, 0.0001], [], False)

有人可以幫我嗎? 謝謝

在 windows 和 macos 中默認情況下,“生成”新進程的方式基本上相當於“啟動一個新的 python 進程,導入所有相同的模塊,將“主”文件作為庫導入,然后使用pickle交換哪個function 調用以及 arguments 是什么”。 在 *nix 系統上的替代方法是“fork”,其中復制了進程 memory 並且新進程從同一點開始。

這里的重要含義是,當使用“spawn”時,您正在運行的“主”文件在import時不得產生更多的子線程。 如果是這樣,第一個孩子在import __main__ import __main__會產生曾孫,依此類推,創建無限遞歸的子進程。 這顯然是一個問題,因此如果您在此導入階段嘗試在子進程中創建新進程,python 會引發錯誤。

避免這個問題的解決方案是防止任何產生子進程的進程在主進程之外執行(這對於在作為主進程而不是作為庫導入時在庫上運行測試等事情也很有用)。

if __name__ == "__main__":
    trainTestResults = GGSCrossVal(data, 25, [10, 1, 0.1, 0.01, 0.001, 0.0001], [], False)

暫無
暫無

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

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