Это на самом деле сложная проблема, связанная с низкоуровневыми системными примитивами, такими как fork
и mmap
Проблема в том, что процессы не разделяют память,В результате каждый процесс работает со своей собственной копией исходного массива.Это является следствием того, как процессы создаются с помощью системного вызова fork
: текущий процесс, код и память копируются как новый процесс, и они оба продолжают свое соответствующее выполнение.
много обходных путей, но самым простым будет использование отображения памяти.Отображение памяти - это объект, созданный системным вызовом mmap
, который отображает часть диска в ОЗУ и доступен как дескриптор файла.Поскольку файловые дескрипторы на самом деле не копируются в fork
, они фактически будут общими для всех процессов.
К счастью, numpy определяет абстракцию традиционного объекта mmap
, который имеет интерфейс массива: np.memmap
,Как я уже говорил, отображение памяти поддерживается файлом на диске, поэтому вам необходимо указать ему путь и режим доступа.
Вы можете определить свой глобальный образ следующим образом:
img_op = np.memmap(
"/tmp/shared_image", dtype=np.uint8, mode='w+', shape=(height, width, 1)
)
Поскольку объект np.memmap
имеет интерфейс массива, его можно использовать где угодно, так же как и обычный массив.