Как предоставить дочерним процессам доступ к данным в разделяемой памяти, если данные доступны только после того, как дочерние процессы были порождены (с использованием multiprocessing.Process )?
Мне известно о multiprocessing.sharedctypes.RawArray , но я не могу понять, как предоставить моим дочерним процессам доступ к RawArray
, который создается после того, как процессы уже запущены.
Данные генерируются родительским процессом, и объем данных заранее не известен.
Если бы не GIL , я бы использовал многопоточность, что немного упростило бы эту задачу. Использование реализации, отличной от CPython, не вариант.
Если заглянуть под капот muliprocessing.sharedctypes , похоже, что общие объекты ctype выделяются с использованием памяти mmap
ed .
Итак, этот вопрос на самом деле сводится к следующему: Может ли дочерний процесс получить доступ к анонимно отображаемой памяти, если mmap ()
был вызван родителем после того, как дочерний процесс был порожден?
Это в некоторой степени. в русле того, что задают в этом вопросе , за исключением того, что в моем случае вызывающий mmap ()
является родительским процессом, а не дочерним процессом.
Я создал свою собственную версию RawArray
, которая использует shm_open ()
под капотом. Результирующий совместно используемый массив ctypes может использоваться любым процессом, если идентификатор ( tag
) совпадает.
См. этот ответ для получения подробной информации и примера.