Эффективный Python для Python IPC
Каким будет межпроцессная коммуникация (IPC) с учетом следующих требований:
- Перенос собственных объектов Python между двумя процессами Python
- Эффективный во времени и процессор (оперативность RAM неактуальна)
- Кросс-платформенная Win\Linux
- Приятно иметь: работает с PyPy
ОБНОВЛЕНИЕ 1: процессы находятся на одном хосте и используют те же версии Python и других модулей
ОБНОВЛЕНИЕ 2: процессы запускаются независимо пользователем, ни одна из них не порождает других
Ответы
Ответ 1
Собственные объекты не распределяются между процессами (из-за подсчета ссылок).
Вместо этого вы можете рассортировать их и делиться ими с помощью сокетов домена unix, mmap, zeromq или посредника, такого как sqlite3, который предназначен для одновременного доступа.
Ответ 2
Используйте multiprocessing для начала.
Если вам нужно несколько процессоров, посмотрите celery.
Ответ 3
Оба execnet и Pyro упоминают сообщение PyPy <-> CPython
. Другие пакеты из страницы Python Wiki Параллельная обработка, вероятно, также подходят.
Ответ 4
Parallel Python может стоить того, чтобы он выглядел, он работает на Windows, OS X и Linux (и, кажется, я вспоминаю, что использовал его на машина UltraSPARC Solaris 10 некоторое время назад). Я не знаю, работает ли он с PyPy, но
Ответ 5
После некоторого теста я обнаружил, что для Linux используется следующий подход, используя mmap
.
Linux имеет /dev/shm
. Если вы создаете общую память с помощью POSIX shm_open
, в этой папке создается новый файл.
Хотя модуль python mmap
не предоставляет функцию shm_open
. мы можем использовать обычный open
для создания файла в /dev/shm
, и он фактически похож и находится в памяти. (Используйте os.unlink
, чтобы удалить его)
Затем для IPC мы можем использовать mmap
для сопоставления этого файла с виртуальной памятью различных процессов. Все процессы разделяют эту память. Python может использовать память в качестве буфера и создавать на ней такие объекты, как байты и массивы numpy. Или мы можем использовать его через интерфейс ctypes
.
Конечно, примитивы синхронизации процесса по-прежнему необходимы, чтобы избежать условий гонки.
См. mmap doc, ctypes doc и numpy.load
, который имеет параметр mmap_mode
.