Я пытаюсь использовать одну из функций GGS в Python 2.7 ( https://github.com/cvxgrp/GGS < / a>, функция, которую я пытаюсь использовать, находится внутри ggs.py и называется GGSCrossVal, строка 72), но Python показал мне эту ошибку:

Попытка запустить новый процесс до того, как текущий процесс завершит фазу начальной загрузки. Вероятно, это означает, что вы работаете в Windows и забыли использовать правильную идиому в основном модуле: if name == ' main ': freeze_support () ... Строку «freeze_support ()» можно опустить, если программа не будет заморожена для создания исполняемого файла Windows.

Куда мне поставить эту команду? .

Я сгенерировал матрицу данных размером 2x3740, данные взяты из двумерного распределения с определенным средним и определенной ковариационной матрицей (на самом деле я сгенерировал их в MATLAB и импортировал в Python) и вызвал функцию следующим образом:

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

Может кто-нибудь мне помочь? Спасибо

1
Marcello Marra 18 Мар 2021 в 01:08

1 ответ

Лучший ответ

В Windows и по умолчанию в macos способ «порождения» нового процесса в основном сводится к «запуску нового процесса Python, импорту всех тех же модулей, импорту« основного »файла как библиотеки, а затем использованию {{X0} } для обмена, какую функцию вызывать и какие аргументы ». Альтернативой этому в системах * nix является «fork», когда память процесса копируется, и новый процесс запускается с той же точки.

Важное следствие здесь состоит в том, что при использовании «порождения» запущенный «главный» файл не должен порождать больше дочерних потоков, когда он import ed. Если бы это было так, первые потомки порождали бы внуков, когда они import __main__, которые затем порождали бы правнуков, когда они import __main__, и так далее, создавая бесконечно рекурсивные дочерние процессы. Очевидно, что это проблема, поэтому python выдает ошибку, если вы пытаетесь создать новые процессы в дочернем процессе на этом этапе импорта.

Решение, позволяющее избежать этой проблемы, состоит в том, чтобы предотвратить выполнение любых, порождающих дочерние процессы, вне основного процесса (это также полезно для таких вещей, как запуск тестов в библиотеке, когда она выполняется как основной процесс, а не импортируется как библиотека).

if __name__ == "__main__":
    trainTestResults = GGSCrossVal(data, 25, [10, 1, 0.1, 0.01, 0.001, 0.0001], [], False)
0
Aaron 18 Мар 2021 в 17:27