web-dev-qa-db-fra.com

Efficace Python à Python IPC

Que serait une communication inter-processus (IPC) framework\technique avec les exigences suivantes:

  • Transfert natif Python objets entre deux Python processus
  • Efficace en temps et en CPU (l'efficacité de la RAM n'est pas pertinente)
  • Win\Linux multiplateforme
  • Agréable à avoir: fonctionne avec PyPy

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

26
Jonathan

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.

18
Raymond Hettinger

Utilisez multitraitement pour commencer.

Si vous avez besoin de plusieurs processeurs, regardez céleri .

8
S.Lott

Les deux execnet et Pyro mentionner PyPy <-> CPython la communication. D'autres paquets de la page Python Wiki Parallel Processing ) conviennent probablement aussi.

6
TryPyPy

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 .

5
ChrisC

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.

5
Liu Sha