Que serait une communication inter-processus (IPC) framework\technique avec les exigences suivantes:
UPDATE 1: les processus sont sur le même hôte et utilisent les mêmes versions de Python et d'autres modules
UPDATE 2: les processus sont exécutés indépendamment par l'utilisateur, aucun d'entre eux ne génère les autres
Les objets natifs ne sont pas partagés entre les processus (en raison du comptage des références).
Au lieu de cela, vous pouvez les sélectionner et les partager en utilisant des sockets de domaine unix, mmap, zeromq ou un intermédiaire tel que sqlite3 conçu pour les accès simultanés.
Utilisez multitraitement pour commencer.
Si vous avez besoin de plusieurs processeurs, regardez céleri .
Les deux execnet et Pyro mentionner PyPy <-> CPython
la communication. D'autres paquets de la page Python Wiki Parallel Processing ) conviennent probablement aussi.
Parallel Python pourrait valoir le coup d'œil, il fonctionne sous Windows, OS X et Linux (et je semble me souvenir que je l'ai utilisé sur une machine UltraSPARC Solaris 10 il y a quelque temps). Je ne sais pas si cela fonctionne avec PyPy, mais il semble fonctionner avec Psyco .
Après quelques tests, j'ai trouvé que l'approche suivante fonctionne pour Linux en utilisant mmap
.
Linux a /dev/shm
. Si vous créez une mémoire partagée à l'aide de POSIX shm_open
, un nouveau fichier est créé dans ce dossier.
Bien que le module mmap
de python ne fournisse pas le shm_open
fonction. nous pouvons utiliser un open
normal pour créer un fichier dans /dev/shm
et il est en fait similaire et réside dans la mémoire. (Utilisation os.unlink
pour le supprimer)
Ensuite, pour IPC, nous pouvons utiliser mmap
pour mapper ce fichier à l'espace mémoire virtuelle des différents processus. Tous les processus partagent cette mémoire. Python peut utiliser la mémoire comme tampon et créer des objets tels que des octets et des tableaux numpy dessus. Ou nous pouvons l'utiliser via l'interface ctypes
.
Bien sûr, les primitives de synchronisation de processus sont toujours nécessaires pour éviter les conditions de concurrence.
Voir mmap doc , ctypes doc et numpy.load
qui a un mmap_mode
option.