Python fork (): передача данных от дочернего элемента к родительскому

#python #numpy #fork #shared-memory #large-data

#python #numpy #разветвление #разделяемая память #большие данные

Вопрос:

У меня есть основной процесс Python и группа рабочих элементов, созданных основным процессом с использованием os.fork() .

Мне нужно передать большие и довольно сложные структуры данных из рабочих обратно в основной процесс. Какие существующие библиотеки вы бы порекомендовали для этого?

Структуры данных представляют собой смесь списков, словарей, numpy массивов, пользовательских классов (которые я могу настроить) и многослойных комбинаций вышеперечисленного.

Следует избегать дискового ввода-вывода. Если бы я мог также избежать создания копий данных — например, используя какое-либо решение с общей памятью — это тоже было бы неплохо, но не является жестким ограничением.

Для целей этого вопроса обязательно, чтобы рабочие были созданы с использованием os.fork() или их оболочки, которая клонировала бы адресное пространство главного процесса.

Это должно работать только в Linux.

Комментарии:

1. «Следует избегать дискового ввода-вывода». Я предполагаю, что это не включает подкачку в ситуациях, когда объем данных в памяти становится достаточно большим, чтобы потребовалась подкачка.

2. @JAB: Ваше предположение верно. Однако конечное решение должно разумно использовать память.

Ответ №1:

multiprocessing реализация очереди работает. Внутренне он отправляет данные в канал.

 q = multiprocessing.Queue()
if (os.fork() == 0):
    print(q.get())
else:
    q.put(5)
# outputs: 5