В системах разветвления дочерние процессы имеют копию при записи записи родительского пространства памяти. Процессы используют виртуальную память, и сразу после разветвления оба виртуальных пространства процесса указывают на одну и ту же физическую память. При записи физическая страница копируется, а виртуальная память перераспределяется, поэтому бит памяти больше не используется совместно. Эта отложенная копия обычно быстрее, чем клонирование пространства памяти на развилке.
В результате ни один из родителей или ребенок не видит изменений в других сторонах. Поскольку вы настраиваете синглтон перед разветвлением, родитель и потомок видят одно и то же значение.
Вот краткий пример, где я использую time.sleep
, чтобы контролировать, когда родитель и ребенок вносят свои личные изменения:
import multiprocessing as mp
import time
def proc():
global foo
time.sleep(1)
print('child foo should be 1, the value before the fork:', foo)
foo = 3 # child private copy
foo = 1 # the value both see at fork
p = mp.Process(target=proc)
p.start()
foo = 2 # parent private copy
time.sleep(2)
print('parent foo should be 2, not the 3 set by child:', foo)
При запуске:
child foo should be 1, the value before the fork: 1
parent foo should be 2, not the 3 set by child: 2