многопроцессорные аргументы python: глубокая копия? - PullRequest
16 голосов
/ 12 мая 2011
from multiprocessing import Process
# c is a container
p = Process(target = f, args = (c,))
p.start()

Я предполагаю, что глубокая копия c передается в функцию f, потому что мелкая копия не имеет смысла в случае нового процесса (новый процесс не имеет доступа к данным извызывающий процесс).

Но как определяется эта глубокая копия?В документации copy.deepcopy() имеется целый набор заметок . Применимы ли все эти заметки и здесь?Документация multiprocessing ничего не говорит ...

1 Ответ

15 голосов
/ 12 мая 2011

Когда вы создаете экземпляр Process, под капотом Python выдает fork().Это создает дочерний процесс, пространство памяти которого является точной копией его родителя - поэтому все существующее на момент разветвления копируется .

В Linux это становится эффективным благодаря «копированию при записи».Из справочной страницы fork :

fork () создает дочерний процесс, который отличается от родительского процесса только своими PID и PPID и тем, что использование ресурсов установленок 0. Блокировки файлов и ожидающие сигналы не наследуются.

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

...