Python 函数中的多处理:将 freeze_support() 放在哪里?

问题描述

我正在尝试使用 Python 2.7 中的 GGS 函数之一(https://github.com/cvxgrp/GGS,我尝试使用的函数位于 ggs.py 中,名为 GGSCrossVal,第 72 行)但 Python 向我展示了这个错误

尝试在当前进程完成其引导阶段之前启动一个新进程。这可能意味着您使用的是 Windows 并且忘记在主模块中使用正确的习惯用法:if name == 'ma​​in': freeze_support() ...如果程序不会被冻结以生成 Windows 可执行文件,则可以省略“freeze_support()”行。

我必须把这个命令放在哪里? .

生成一个 2x3740 的数据矩阵,数据取自具有特定均值和特定协方差矩阵的二元分布(实际上我已经在 MATLAB 中生成它们并在 Python 中导入)并以这种方式调用函数:>

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

有人可以帮我吗? 谢谢

解决方法

在 windows 和默认情况下在 macos 中,“生成”新进程的方式基本上相当于“启动一个新的 python 进程,导入所有相同的模块,将‘main’文件作为库导入,然后使用 { {1}} 来交换要调用的函数和参数是什么”。在 *nix 系统上的替代方法是“fork”,其中复制进程内存并且新进程从同一点开始。

这里的重要含义是,当使用“spawn”时,您正在运行的“main”文件在 pickleed 时不能产生更多的子线程。如果是这样,第一个子进程会在 import 时产生孙子进程,然后在它们 import __main__ 时产生曾孙子进程,依此类推,创建无限递归子进程。这显然是一个问题,因此如果您在此导入阶段尝试在子进程中创建新进程,python 会引发错误。

避免这个问题的解决方案是防止任何产生子进程的东西在主进程之外执行(这对于在作为主进程运行而不是作为库导入时在库上运行测试也很有用).

import __main__