Могут ли дочерние процессы создавать общую память и делиться ею с родительскими процессами?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Могут ли дочерние процессы создавать общую память и делиться ею с родительскими процессами?

Сообщение Anonymous »

Может ли дочерний процесс создать объект SharedMemory и поделиться им с родительским процессом? В настоящее время я получаю ошибки при попытке. Мне это нужно, поскольку создание и копирование памяти является основным узким местом моего приложения, но мне нужно записать общую память в родительский процесс.
Вот три минимальных примера, иллюстрирующих проблему. Я использую 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()
Случай 2 (нет ошибки): создание общей памяти в дочернем процессе без совместного использования с родительским процессом

Код: Выделить всё

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()
Случай 3 (ОШИБКА): создать общую память в дочернем процессе, поделиться ею с родительским

Код: Выделить всё

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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»