繁体   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