Могут ли процессы Python совместно использовать живые объекты? - PullRequest
7 голосов
/ 01 апреля 2012

У меня есть многопроцессное приложение на Python (процессы порождаются uwsgi), которому нужно хранить переменные в ОЗУ, а затем читать и обновлять эти переменные из нескольких разных процессов.Я знаю, что доступно много вариантов кэширования, но все, что я нашел, могут хранить только строки.Возможно ли, чтобы разные процессы Python обращались к одной и той же виртуальной памяти и, таким образом, обменивались данными, даже не конвертируя и даже не копируя их?

1 Ответ

6 голосов
/ 03 апреля 2012

Помимо POSH, Python Shared Objects, , который по крайней мере выполняет часть того, что вы хотите сделать (помещать объекты Python в общую память SvsV-IPC и изменять их из нескольких процессов) и может служить в качестве Отправная точка в разработке вашего собственного модуля расширения, отвечающего вашим потребностям в процессах, порождаемых wsgi-сервером. В мире Python нет ничего другого (о чем я знаю ...), который не полагается на выборку / удаление объектов при совместном использовании. их между процессами.

Еще одна вещь, которая также приходит на ум, это Pyro , которая осуществляет обмен по произвольным сетевым соединениям между процессами (поэтому может также делиться через сокеты Unix-Domain), и на моем собственном опыте больше гибкий, чем то, что может предложить встроенная многопроцессорная для (прокси) управления объектами.

Вы также можете взглянуть на то, можете ли вы получить веб-сервер, который заставляет ваше WSGI-приложение не форкать процессы, а использовать потоки; таким образом, вам просто нужно использовать стандартные глобальные данные Python для общего кэша объектов, к которому вы затем можете обращаться из всех порождаемых потоков обработчика WSGI. Многопоточный WSGI-сервер - это, например, CherryPy-встроенный wsgiserver , который я использую для проекта, который точно соответствует вашим требованиям. mod_wsgi также работает для вашего контекста в случае, если вы конфигурируете Apache с рабочим MPM (чтобы потоки Apache не обрабатывали новые процессы).

Если все это не вариант, как насчет извлечения фактической обработки, которую вы сейчас выполняете на веб-сервере, во внешний процесс, с которым веб-страницы взаимодействуют через некоторую форму механизма RPC для передачи рабочих запросов и получения данных ? Сервер обработки "backend" может быть простым многопоточным процессом Python, который предлагает интерфейс XML-RPC через стандартную библиотеку SimpleXMLRPCServer или что-то подобное.

...