socket python3 processes asyncio python ipc inter-process-communicat

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.