Можно ли использовать общую память в multiprocessing в Python
Что проверяют
Понимаете ли вы, что процессы в Python по умолчанию не делят память, и знаете ли инструменты, которые это меняют. Следом обычно спрашивают про синхронизацию и про то, чем общая память лучше очереди.
Как отвечать
Да, и способов несколько:
ValueиArray: типизированные значения ctypes в разделяемой памяти,Value('i', 0),Array('d', 1000). По умолчанию они обёрнуты в блокировку, но она защищает только отдельное чтение или запись. Операцияnum.value += 1состоит из чтения и записи, поэтому безwith num.get_lock():инкременты теряются.RawValueиRawArrayработают без блокировки;multiprocessing.shared_memory(с Python 3.8):SharedMemoryдаёт именованный блок байтов, к которому подключаются по имени. Классический приём:np.ndarray(shape, dtype=..., buffer=shm.buf), и несколько процессов работают с одним массивом без копирования.ShareableListхранит простые значения. Каждый процесс вызываетclose(), а создатель ещё иunlink(), иначе сегмент останется в системе;Manager:dict,list,Namespaceчерез отдельный серверный процесс. Удобно, но это не общая память, а прокси с сериализацией на каждое обращение, поэтому медленно;- fork и copy-on-write: при методе запуска
forkдочерний процесс видит данные родителя без копирования, пока их не меняют. В CPython счётчики ссылок меняются даже при чтении объектов, поэтому страницы всё равно копируются. Метод по умолчанию зависит от платформы:spawnна macOS и Windows, а на Linux начиная с Python 3.14forkserverвместоfork.
Большие числовые массивы удобнее держать в SharedMemory с NumPy, а обмен задачами и результатами надёжнее через Queue или ProcessPoolExecutor.
Где спотыкаются
Делают += на Value без get_lock(). На двух процессах гонку можно не увидеть, на восьми с циклом она проявится сразу.
Забывают unlink(). Блоки копятся в /dev/shm, а resource_tracker пишет предупреждения об утечке.
Пытаются положить в SharedMemory произвольный объект Python. Там только байты: словари и списки строк придётся сериализовать или раскладывать в фиксированную структуру.