Вы правы насчет копирования.yo.double
- это «связанный метод», связанный с вашим большим объектом.Когда вы передаете его в пул-метод, он извлекает весь экземпляр вместе с ним, отправляет его дочерним процессам и распаковывает его там.Это происходит для каждого куска итерируемого дочернего процесса.Значение по умолчанию для chunksize
в pool.imap
равно 1, поэтому вы используете эту коммуникационную нагрузку для каждого обработанного элемента в итерируемом.
Наоборот, когда вы передаете double_wrap
, вы просто передаете модуль-функция уровня.Только его имя будет фактически засечено, а дочерние процессы импортируют функцию из __main__
.Поскольку вы, очевидно, работаете в ОС, которая поддерживает разветвление, ваша функция double_wrap
будет иметь доступ к разветвленному экземпляру yo
Yo
.В этом случае ваш большой объект не будет сериализован (протравлен), поэтому накладные расходы по связи незначительны по сравнению с другим подходом.
@ Darkonaut Я просто не понимаю, зачем делатьУровень функционального модуля предотвращает копирование объекта.В конце концов, функция должна иметь указатель на сам объект yo, что требует, чтобы все процессы копировали yo, поскольку они не могут совместно использовать память.
Функция, запущенная в дочернем процессе, автоматически найдетссылка на глобальный yo
, потому что ваша операционная система (ОС) использует fork для создания дочернего процесса.Форкинг приводит к клонированию всего вашего родительского процесса, и пока ни родитель, ни потомок не изменят определенный объект, оба будут видеть один и тот же объект в одном и том же месте памяти.
Только если родитель или потомок что-то изменят вобъект, объект get копируется в дочерний процесс.Это называется «копирование при записи» и происходит на уровне операционной системы, когда вы не обращаете на это внимания в Python.Ваш код не будет работать в Windows, которая использует «spawn» в качестве метода запуска для новых процессов.
Теперь я упрощаю немного выше, где пишу «объект копируется», так как модуль ОСоперирует «страницей» (чаще всего это будет размер 4 КБ).Этот ответ здесь был бы хорошим продолжением для расширения вашего понимания.