многопроцессорность.freeze_support()

Почему многопроцессорный модуль должен вызывать для работы определенную функцию когда он «заморожен» для создания исполняемого файла Windows?


person Voo    schedule 17.12.2012    source источник
comment
Не проверяя слишком много, я бы предположил, что это потому, что многопроцессорная обработка должна знать об интерпретаторе Python, в котором она работает, чтобы он мог вызывать больше из них, и потому, что упаковка, такая как py2exe, делает необычные вещи с включенными модулями, которые также необходимо учитывать их импорт.   -  person Colin Valliant    schedule 14.05.2013
comment
Я ценю ваш чрезвычайно полезный комментарий к моему ответу относительно компараторов!   -  person GhostCat    schedule 01.04.2019


Ответы (1)


Причина в отсутствии fork() в Windows (что не совсем верно). По этой причине в Windows вилка имитируется путем создания нового процесса, в котором выполняется код, который в Linux запускается в дочернем процессе. Поскольку код должен выполняться в технически несвязанном процессе, он должен быть доставлен туда, прежде чем его можно будет запустить. То, как он доставляется, заключается в том, что сначала он маринуется, а затем отправляется по трубе от исходного процесса к новому. Кроме того, этот новый процесс получает информацию о том, что он должен запустить код, переданный по каналу, передав ему аргумент командной строки --multiprocessing-fork. Если вы посмотрите на реализация freeze_support() функция, ее задача состоит в том, чтобы проверить, должен ли процесс, в котором он выполняется, запускать код, переданный по каналу, или нет.

person Piotr Dobrogost    schedule 12.08.2013
comment
Одна вещь, которая не ясна на 100%, заключается в том, что объект/метод, который подготавливает новый процесс к запуску, должен вызывать метод freeze_support()? И это может быть где угодно внутри объекта/метода, но до вызова метода Process.start()? - person Har; 18.02.2015
comment
Я хотел бы получить ответ и на этот вопрос, заданный @Har, если вы его знаете. Рецепт PyInstaller призывает к вызову вне своего пользовательского класса Process. Это нужно? Могу ли я просто поместить эту функцию freeze_support() в функцию init() этого объекта? Это было бы чертовски чище! - person BuvinJ; 08.02.2017
comment
Или в области видимости статического класса (извините, я не знаю терминологии Python для этого)? Вот о чем я говорю, кстати: github.com/pyinstaller/pyinstaller/wiki/ Рецепт-Многопроцессорность - person BuvinJ; 08.02.2017