Общая память между процессами python

Я пытаюсь выяснить способ обмена памятью между процессами python. В основном существуют объекты, которые существуют, что несколько процессов python должны иметь возможность читать (читать только) и использовать (без мутации). Прямо сейчас это реализовано с использованием redis + strings + cPickle, но cPickle занимает драгоценное время процессора, поэтому я не хочу этого использовать. Большинство реализаций разделяемой памяти python, которые я видел в интернатах, похоже, требуют файлов и рассолов, которые в основном являются тем, что я делаю, и точно, чего я пытаюсь избежать.

Что мне интересно, если бы был способ написать подобный... в основном базу данных/сервера объектов python в памяти и соответствующий модуль C для взаимодействия с базой данных?

В основном модуль C запрашивал у сервера адрес для записи объекта, сервер отвечал бы адресом, затем модуль записывал бы объект и уведомлял сервер о том, что объект с заданным ключом был записан в диска в указанном месте. Затем, когда какой-либо из процессов хотел получить объект с заданным ключом, он просто попросил бы db для ячейки памяти для данного ключа, сервер ответит местоположением, и модуль будет знать, как загрузить это пространство в памяти и перенесите объект python обратно в процесс python.

Неужели это абсолютно необоснованно или просто чертовски сложно реализовать? Я погоню за чем-то невозможным? Любые предложения приветствуются. Спасибо, интернет.

Ответ 1

Неразумно.

IPC может быть выполнен с помощью файла с отображением памяти. Python имеет встроенные функции:

http://docs.python.org/library/mmap.html

Просто mmap файл в обоих процессах и hey-presto у вас есть общий файл. Конечно, вам нужно будет опросить его в обоих процессах, чтобы узнать, какие изменения. И вам придется взаимодействовать между ними. И решить, в какой формат вы хотите поместить свои данные. Но это общее решение вашей проблемы.

Ответ 2

Если вы не хотите травления, multiprocessing.sharedctypes может поместиться. Это немного низкоуровневое; вы получаете одиночные значения или массивы определенных типов.

Другой способ распространения данных для дочерних процессов (один путь) - multiprocessing.Pipe. Это может обрабатывать объекты Python, и он реализован на C, поэтому я не могу сказать вам, что он использует травление или нет.