Аргументы многопроцессорности python: глубокая копия?

from multiprocessing import Process
# c is a container
p = Process(target = f, args = (c,))
p.start()

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

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

Ответ 1

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

В Linux это достигается благодаря использованию "copy-on-write". На странице fork man:

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

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