python3 - socket module
Eficiente Python a Python IPC (5)
¿Qué sería un marco / técnica de comunicación entre procesos (IPC) con los siguientes requisitos:
- Transfiera objetos nativos de Python entre dos procesos de Python
- Eficiente en tiempo y CPU (eficiencia RAM irrelevante)
- Multiplataforma Win / Linux
- Es bueno tener: trabaja con PyPy
ACTUALIZACIÓN 1: los procesos están en el mismo host y utilizan las mismas versiones de Python y otros módulos
ACTUALIZACIÓN 2: los procesos son ejecutados independientemente por el usuario, ninguno de ellos genera los otros
Después de algunas pruebas, encontré que el siguiente enfoque funciona para Linux usando mmap
.
Linux tiene /dev/shm
. Si crea una memoria compartida utilizando POSIX shm_open
, se shm_open
un nuevo archivo en esta carpeta.
Aunque el módulo mmap
de python no proporciona la función shm_open
. Podemos usar una open
normal para crear un archivo en /dev/shm
y en realidad es similar y reside en la memoria. (Utilice os.unlink
para eliminarlo)
Luego, para IPC, podemos usar mmap
para asignar ese archivo al espacio de memoria virtual de los diferentes procesos. Todos los procesos comparten esa memoria. Python puede usar la memoria como búfer y crear objetos como bytes y matrices numpy encima de ella. O podemos usarlo a través de la interfaz ctypes
.
Por supuesto, las primitivas de sincronización de procesos todavía son necesarias para evitar las condiciones de carrera.
Consulte mmap doc , ctypes doc y numpy.load
que tiene una opción mmap_mode
.
Los objetos nativos no se comparten entre procesos (debido al conteo de referencias).
En su lugar, puede elegirlos y compartirlos utilizando sockets de dominio Unix, mmap, zeromq o un intermediario como sqlite3 que está diseñado para accesos concurrentes.
Merece la pena echarle un vistazo a Python paralelo , funciona en Windows, OS X y Linux (y me parece recordar que lo usé en una máquina UltraSPARC Solaris 10 hace un tiempo). No sé si funciona con PyPy, pero parece funcionar con Psyco .
Tanto execnet como Pyro mencionan PyPy <-> CPython
communication. Otros paquetes de la página de procesamiento paralelo de Python Wiki probablemente también sean adecuados.
Utilice multiprocessing para empezar.
Si necesitas múltiples CPU''s, mira el celery .