2013-11-26 2 views
8

Запуск python 2.7 на windows 7 (64 бит).многопроцессор python для окон, если __name__ == "__main__"

При чтении документации для модуля multiprocessing библиотеки, он утверждает, несколько раз важности __main__ модуля, включая условные (особенно в Windows):

if __name__ == "__main__": 
    # create Process() here 

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

Мне не нужно размещать диспетчеры процессов на самом верхнем уровне иерархии выполнения пакета (выполнение в PARENT). Пока мой Process() создается, управляется и завершается методом класса или даже при закрытии функции. Просто не в пространстве имен модулей верхнего уровня.

Я правильно понимаю это предупреждение/требование?


EDIT

После первых двух ответов, я добавить эту цитату. Это во введении для Раздел 16.6 многопроцессорная обработка из 2.7 документов.

Примечание: Функциональность в пределах этого пакета требует, чтобы __main__ модуля будет ввозом детьми. Это описано в программировании принципы однако стоит отметить, here.This означает, что некоторые примеры, такие как multiprocessing.Pool примеры не будут работать в интерактивный интерпретатор ...

+5

Педантичное примечание: переменные в 'if __name__ == '__main __':' все еще находятся в ** пространстве имен ** модуля, когда код действительно выполняется.Однако код не выполняется, когда модуль импортируется. (I.e. Я считаю, что если вы импортируете основной модуль программы, вы можете извлекать переменные из своего основного блока в качестве атрибутов модуля.) – millimoose

+0

Так что переменные @millimoose, созданные внутри 'if', доступны для всех порожденных процессов на компьютере Windows, правильно? Даже если они не были объявлены за пределами 'if'? – Kartik

+0

@ Kartik - Я не уверен, что понимаю вопрос, прошло уже три года. Я думаю, они будут доступны, но их ценности будут поддельными. Я предлагаю вам написать некоторый тестовый код, чтобы узнать, что вы имеете в виду, и опубликовать новый вопрос о SO, если у вас есть какие-то конкретные проблемы с ним. – millimoose

ответ

15

Вы не должны вызывать Process() с «верхнего уровня» модуля. Это классно позвонить Process из метода класса.

Единственное предостережение в том, что вы не можете разрешить Process() называться, если или когда модуль импортируется.

Поскольку Windows не имеет fork, модуль многопроцессорности запускает новый процесс Python и импортирует вызывающий модуль. Если Process() получает вызов при импорте, это приводит к бесконечной последовательности новых процессов (или пока ваша машина не исчерпает ресурсы). Это причина для сокрытия вызовов Process() внутри

if __name__ == "__main__" 

поскольку операторы внутри этого if-statement не будет вызван на импорт.

+0

Полагаю, я понимаю вашу точку зрения. Я редактировал исходный вопрос, который лучше иллюстрирует мое замешательство. – user2097818

+0

Вопрос: * «Зачем ему было нужно импортировать' __main__'? »*. A: В Windows вызов 'Process()' вызывает импорт вызывающего модуля. При использовании «многопроцессорности» вам необходимо закодировать с ожиданием, что вызывающий модуль будет импортирован. – unutbu

+0

Я думаю, что я слишком анализирую. Я планирую импортировать модуль мультипроцессорности. Фактически, он никогда не будет выведен, потому что моя программа также собирается импортировать его и должна взаимодействовать с классом Factory перед созданием экземпляров Process(). – user2097818

0

__name__ всегда равен "__main__", если скрипт был выполнен напрямую, либо через python foo.py, либо python -m foo. Этот обеспечивает, что Process() не будет вызываться, если вместо этого скрипт импортируется как модуль.

+2

Так многопроцессорность не может использоваться в модуле? – jul

+0

@jul Это может быть, но фактический вызов конструктора 'Process()' должен быть обернут как «команда Singleton». Это связано с тем, что Windows не только * клонирует * процесс, но и повторно выполняет копию интерпретатора python, что означает, что «основной модуль» будет импортирован дважды. По существу, сохраните «активность» импорта до минимума. После завершения импорта вы можете делать все, что захотите, с помощью классов и функций вашего модуля. – user2097818

+0

@ user2097818 Не могли бы вы более подробно объяснить, что вы подразумеваете под «Синглтон-командой»? По сути, мне интересно, могу ли я создать функцию (определенную в некотором модуле, которую я буду импортировать) и выполнить эту функцию, не обернув ее в «if __name__ == '__main__», которая внутренне использовала многопроцессорность? – Ymareth

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