В Python multiprocessing.Process, мы должны использовать `__name__ == __main__`? - PullRequest
0 голосов
/ 10 июня 2018

Я пишу класс, который поддерживает простой в использовании API для добавления различных настроек для запуска данной программы (class.add(args)) и для сравнения всех настроек с многопроцессорной обработкой (class.benchmark(num_processes=5)).

Из документации многопроцессорной обработки. Процесс, похоже, во всех случаях использует if __name__ == '__main__'.Безопасно ли его пропускать?

Например, метод класса benchmark(num_processes=5) запускает и присоединяет процессы, а другой файл python file.py создает класс и просто вызывает class.benchmark(num_processes=5).Будет ли это работать как обычно?

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

Как описано в руководящих принципах многопроцессорной обработки под заголовком "Безопасный импорт основного модуля", некоторые формы многопроцессорной обработки необходимо импортировать ваш основной модуль, и, таким образом, ваша программа может быть запущена в fork бомбе, если проверка __name__ == '__main__' отсутствует.В частности, это имеет место в Windows, где CPython не может fork .Так что это не безопасно, чтобы пропустить это.Тест принадлежит на верхнем (глобальном) уровне вашего модуля, а не внутри какого-то класса.Его цель - запретить модулю автоматически запускать задачи (в отличие от определения классов, функций и т. Д.) При его импорте, а не запускаться напрямую.

0 голосов
/ 10 июня 2018

if __name__ == '__main__': используется для указания, какой код запускать при загрузке модуля.По сути, он загружается либо когда вы запускаете его как скрипт, либо когда вы импортируете его как библиотеку.В первом случае обычно пишут это так, что весь написанный код выполняется, поэтому нет необходимости включать его.Но когда вы пишете библиотеку, может быть какой-то код, который вы не будете запускать, когда другие люди его импортируют, например, короткий пример или тесты.Поэтому в последнем случае вы определенно захотите включить его.

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

...