Вот три минимальных примера, иллюстрирующих проблему. Я использую time.sleep(1), чтобы контролировать, завершается ли первым родительский или дочерний процесс.
Случай 1 (нет ошибок): создать общую память в родительском процессе, поделиться ею с дочерним процессом
Код: Выделить всё
import time
from multiprocessing import shared_memory, Process
def worker():
shm = shared_memory.SharedMemory(name="test")
shm = shared_memory.SharedMemory(name="test", create=True, size=1)
Process(target=worker).start()
time.sleep(1)
shm.unlink()
Код: Выделить всё
import time
from multiprocessing import shared_memory, Process
def worker():
shm = shared_memory.SharedMemory(name="test", create=True, size=1)
time.sleep(1)
shm.unlink()
Process(target=worker).start()
Код: Выделить всё
import time
from multiprocessing import shared_memory, Process
def worker():
shm = shared_memory.SharedMemory(name="test", create=True, size=1)
time.sleep(1)
shm.unlink()
Process(target=worker).start()
shm = shared_memory.SharedMemory(name="test")
Код: Выделить всё
Traceback (most recent call last):
File "/home/benjamin/Documents/duckit/covin.py", line 24, in
shm = shared_memory.SharedMemory(name="test")
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/benjamin/miniforge3/envs/hichdev/lib/python3.12/multiprocessing/shared_memory.py", line 104, in __init__
self._fd = _posixshmem.shm_open(
^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: '/test'
Я пытаюсь использовать numpy loadtxt в ряде дочерних процессов над кучей файлов. (задача с узким местом ЦП, а не с узким местом ввода-вывода, поэтому выполняется с использованием многопроцессорной обработки). Затем я хочу записать массивы в файл HDF5, что наиболее эффективно, если делать это последовательно в основном потоке. Если массивы необходимо скопировать, чтобы родительский процесс мог их получить (например, при передаче через очередь многопроцессорной обработки или их возврате), то это становится узким местом производительности для всей программы. Следовательно, я хочу скопировать массивы в общую память дочерних процессов и поделиться ими с родительским процессом для их записи.
Подробнее здесь: https://stackoverflow.com/questions/792 ... -processes