2013-12-03 3 views
6

При использовании многопроцессорной обработки в python на окнах ожидается защита точки входа программы. В документации говорится: «Убедитесь, что основной модуль можно безопасно импортировать новым интерпретатором Python, не вызывая непреднамеренных побочных эффектов (например, запуск нового процесса)». Может ли кто-нибудь объяснить, что именно это означает?Обязательное использование if __name __ == "__ main__" в окнах при использовании многопроцессорности

+0

Это уже было задано и несколько раз здесь ... –

ответ

9

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

  1. Все данные структуры, существующие в основной программе являются видимыми для дочерних процессов. Они фактически работают на копиях данных.
  2. Действия дочерних процессов начинаются с команды, следующей за fork(), в основной программе, поэтому любой код уровня модуля, уже выполненный в модуле, не будет выполнен снова.

fork() невозможно в Windows, поэтому в Windows каждый модуль заново импортируется каждым дочерним процессом. Итак:

  1. В Windows нет структур данных, существующих в основной программе не видны дочерние процессы; и
  2. Все код уровня модуля выполняется в каждом дочернем процессе.

Таким образом, вы должны думать немного о том, какой код вы хотите выполняется только в основной программе. Наиболее очевидным примером является то, что вы хотите, чтобы код, который создает дочерние процессы для запуска только в основной программе, должен быть защищен __name__ == '__main__'. Для более тонкого примера рассмотрим код, который создает гигантский список, который вы собираетесь передать процессам рабочего процесса для сканирования. Вероятно, вы тоже захотите это защитить, потому что в этом случае нет смысла, чтобы каждый рабочий процесс удалял ОЗУ и время, создавая свои собственные бесполезные копии гигантского списка.

Обратите внимание, что это хорошая идея, чтобы использовать __name__ == "__main__" надлежащим образом даже на Linux-у систем, потому что это делает намеченное разделение труда понятнее. Параллельные программы могут сбивать с толку - каждый бит помогает ;-)

3

Модуль multiprocessing работает, создавая новые процессы Python, которые будут импортировать ваш модуль. Если вы не добавили защиту __name__== '__main__', вы должны ввести бесконечный цикл создания нового процесса. Это происходит следующим образом:

  • Ваш модуль импортируется и выполняет код во время импорта, который вызывает multiprocessing, чтобы создать 4 новых процесса.
  • Эти 4 новых процесса, в свою очередь, импортируют модуль и выполняют код во время импорта, что вызывает multiprocessing, чтобы создать 16 новых процессов.
  • Эти 16 новых процессов, в свою очередь, импортируют модуль и выполняют код во время импорта, что вызывает multiprocessing, чтобы создать 64 новых процесса.
  • Ну, надеюсь, вы получите картину.

Итак, идея состоит в том, что вы убедитесь, что процесс нереста происходит только один раз. И это достигается наиболее легко с идиомой защиты __name__== '__main__'.

+4

@PiotrDobrogost В этом случае вы должны проголосовать, чтобы закрыть вопрос как дубликат. Является ли мой ответ неправильным или бесполезным? –

+0

Дублирование ответов снова и снова бесполезно по сравнению с привязкой к уже существующим. Если у вас есть что добавить к уже существующим ответам, вы можете ответить на уже существующий вопрос. –

+0

@Piotr Так помогите. Найдите дубликат и запустите свой закрытый голос. Если я соглашусь, я тоже проголосую. Вместо того, чтобы жаловаться предпринять некоторые позитивные действия. Почему ты выбрал меня? –

Смежные вопросы