При использовании многопроцессорной обработки в python на окнах ожидается защита точки входа программы. В документации говорится: «Убедитесь, что основной модуль можно безопасно импортировать новым интерпретатором Python, не вызывая непреднамеренных побочных эффектов (например, запуск нового процесса)». Может ли кто-нибудь объяснить, что именно это означает?Обязательное использование if __name __ == "__ main__" в окнах при использовании многопроцессорности
Обязательное использование if __name __ == "__ main__" в окнах при использовании многопроцессорности
ответ
Развернувшись немного на хороший ответ, который вы уже получили, это помогает, если вы понимаете, что делают системы Linux-y. Они порождают новые процессы, используя fork()
, который имеет два хорошие последствия:
- Все данные структуры, существующие в основной программе являются видимыми для дочерних процессов. Они фактически работают на копиях данных.
- Действия дочерних процессов начинаются с команды, следующей за
fork()
, в основной программе, поэтому любой код уровня модуля, уже выполненный в модуле, не будет выполнен снова.
fork()
невозможно в Windows, поэтому в Windows каждый модуль заново импортируется каждым дочерним процессом. Итак:
- В Windows нет структур данных, существующих в основной программе не видны дочерние процессы; и
- Все код уровня модуля выполняется в каждом дочернем процессе.
Таким образом, вы должны думать немного о том, какой код вы хотите выполняется только в основной программе. Наиболее очевидным примером является то, что вы хотите, чтобы код, который создает дочерние процессы для запуска только в основной программе, должен быть защищен __name__ == '__main__'
. Для более тонкого примера рассмотрим код, который создает гигантский список, который вы собираетесь передать процессам рабочего процесса для сканирования. Вероятно, вы тоже захотите это защитить, потому что в этом случае нет смысла, чтобы каждый рабочий процесс удалял ОЗУ и время, создавая свои собственные бесполезные копии гигантского списка.
Обратите внимание, что это хорошая идея, чтобы использовать __name__ == "__main__"
надлежащим образом даже на Linux-у систем, потому что это делает намеченное разделение труда понятнее. Параллельные программы могут сбивать с толку - каждый бит помогает ;-)
Модуль multiprocessing
работает, создавая новые процессы Python, которые будут импортировать ваш модуль. Если вы не добавили защиту __name__== '__main__'
, вы должны ввести бесконечный цикл создания нового процесса. Это происходит следующим образом:
- Ваш модуль импортируется и выполняет код во время импорта, который вызывает
multiprocessing
, чтобы создать 4 новых процесса. - Эти 4 новых процесса, в свою очередь, импортируют модуль и выполняют код во время импорта, что вызывает
multiprocessing
, чтобы создать 16 новых процессов. - Эти 16 новых процессов, в свою очередь, импортируют модуль и выполняют код во время импорта, что вызывает
multiprocessing
, чтобы создать 64 новых процесса. - Ну, надеюсь, вы получите картину.
Итак, идея состоит в том, что вы убедитесь, что процесс нереста происходит только один раз. И это достигается наиболее легко с идиомой защиты __name__== '__main__'
.
@PiotrDobrogost В этом случае вы должны проголосовать, чтобы закрыть вопрос как дубликат. Является ли мой ответ неправильным или бесполезным? –
Дублирование ответов снова и снова бесполезно по сравнению с привязкой к уже существующим. Если у вас есть что добавить к уже существующим ответам, вы можете ответить на уже существующий вопрос. –
@Piotr Так помогите. Найдите дубликат и запустите свой закрытый голос. Если я соглашусь, я тоже проголосую. Вместо того, чтобы жаловаться предпринять некоторые позитивные действия. Почему ты выбрал меня? –
- 1. Почему для многопроцессорного модуля бильярда требуется строка «if __name __ == '__ main__»?
- 2. Выполнены ли вещи выше __name __ == '__ main__'?
- 3. Зачем использовать "if __name __ == '__ main__': main()", а не просто "main()" в Python?
- 4. Как использовать функцию __name __ == '__ main__', когда код, который я хочу сохранить, находится в конце
- 5. Как отлаживать при использовании многопроцессорности в pycharm
- 6. Сохраняйте порядок при использовании многопроцессорности в Python
- 7. Hashlib возвращает повторяющийся хэш при использовании многопроцессорности
- 8. ошибка многопроцессорности python при использовании sqlite3
- 9. Как уменьшить использование памяти при многопроцессорности python?
- 10. RuntimeError и IOError при использовании многопроцессорности в скрипте PyQt
- 11. Ошибка при использовании службы WCF в окнах
- 12. Как сохранить память при использовании многопроцессорности в Python?
- 13. Как я могу улучшить загрузку процессора при использовании модуля многопроцессорности?
- 14. python: проблемы с доступом к переменным при использовании многопроцессорности
- 15. Python: использование карты и многопроцессорности
- 16. обязательное событие при нажатии
- 17. python matplotlib анимация сохранить ошибку при использовании многопроцессорности
- 18. Использование модульной многопроцессорности с pyaudio
- 19. Использование журнала с модулем многопроцессорности
- 20. Использование наборов с модулем многопроцессорности
- 21. Использование многопроцессорности Python в кластере HPC
- 22. Застрял при использовании «для if ...»
- 23. Уменьшение объема памяти при многопроцессорности?
- 24. Использование оператора if при использовании значений из базы данных
- 25. Система исчерпала память при использовании пула многопроцессорности Python?
- 26. Python: использование менеджера многопроцессорности в пуле процессов
- 27. при определенных обстоятельствах Использование Factory или Builder шаблон Обязательное
- 28. Ошибка при использовании модуля многопроцессорности python с функцией генератора.
- 29. Ошибка при использовании Git на окнах 7
- 30. Обязательное подтверждение при использовании оператора 'mod' вместе с 'или'?
Это уже было задано и несколько раз здесь ... –