Solution flexible IPC pour Python sous Linux?

J’écris un programme en Python pour lequel je considère un modèle client-serveur local, mais j’ai du mal à trouver le meilleur moyen pour le serveur de communiquer avec le (s) client (s). Une solution simple et en boîte serait la meilleure – je ne cherche pas à réinventer la roue. Voici mes besoins pour ce programme:

  • Fonctionne sous Linux
  • Le serveur et les clients sont sur le même système, donc je n’ai pas besoin de passer par un réseau.
  • Latence qui n’est pas susceptible d’être ennuyante pour un utilisateur interactif.
  • Plusieurs clients peuvent se connecter au même serveur.
  • Les clients sont démarrés indépendamment du serveur et peuvent se connecter / déconnecter à tout moment.
  • Le nombre de clients est mesurable par dizaines; Je n’ai pas besoin de très grande échelle.
  • Les clients peuvent avoir différentes saveurs:
    1. Lecteurs de stream – Lit un stream continu de données (en pratique, tout est du texte).
    2. Lecteurs d’état – Lit certaines informations d’état qui sont mises à jour de temps en temps.
    3. Writers – Envoie des données au serveur, reçoit une réponse à chaque fois.

Le type de client 1 semble assez simple; c’est un tuyau muet unidirectionnel. Le type de client 2 est un peu plus intéressant. Je veux éviter de simplement interroger le serveur pour vérifier les nouvelles données périodiquement, car cela appendait une latence notable pour l’utilisateur. Le serveur a besoin d’un moyen de signaler à tous et uniquement aux clients concernés lorsque les informations d’état sont mises à jour afin que le client puisse recevoir l’état mis à jour du serveur. Le type de client 3 doit être bidirectionnel; il enverra les données fournies par l’utilisateur au serveur et recevra une sorte de réponse après chaque envoi.

J’ai consulté la page IPC de Python ( http://docs.python.org/2/library/ipc.html ), mais je ne pense pas qu’aucune de ces solutions convienne à mes besoins. Le module de sous-processus est totalement inapproprié et tout le rest est un peu plus bas que je ne le souhaiterais.

La question similaire Efficient Python to Python IPC n’est pas tout à fait la même. Je n’ai pas besoin de transférer des objects Python, je ne m’inquiète pas particulièrement de l’efficacité du processeur pour le nombre de clients que j’ai, je ne m’intéresse qu’à Linux, et aucune des réponses à cette question ne me sera particulièrement utile.

Mettre à jour:

Je ne peux pas accepter une réponse qui me pointe simplement vers un framework / library / module / tool sans donner une explication sur la façon dont il peut être utilisé pour mes trois relations serveur-client différentes. Si vous dites: “Tout cela peut être fait avec des tubes nommés!” Je vais devoir demander “comment?” Les extraits de code seraient idéaux, mais une description de haut niveau d’une solution peut également fonctionner.

Avez-vous déjà examiné ZeroMQ ? Il prend en charge Python, et les exemples documentés couvrent déjà vos cas d’utilisation.

Il est facile à utiliser sur une seule plate-forme, avec une seule machine, mais il peut être facilement étendu à un réseau.