Общая память между процессами 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, поэтому я не могу сказать вам, что он использует травление или нет.