Question

Helllo, Je voudrais vous faire part de petites quantités de données (<1K) entre python et processus. Les données sont PC physique / 104 données IO qui change rapidement et souvent (24x7x365). Il y aura un « serveur » l'écriture des données et de multiples clients de lecture des portions de celui-ci. Le système fonctionne sur ce utilise la mémoire flash (carte CF) plutôt que d'un disque dur, donc je suis inquiet au sujet de porter la mémoire flash avec un système à base de fichiers. Je voudrais aussi utiliser moins d'énergie (temps processeur) que nous sommes 100% énergie solaire.

  • Est-ce un souci valide? On pourrait peut-être changer la carte CF à un SSD.
  • Est-ce que la modification d'une valeur à l'aide mmap écrire physiquement les données sur le disque ou est-ce un fichier virtuel?
  • Nous allons fonctionner sur Debian donc peut-être le IPC POSIX pour module python est la meilleure solution. Quelqu'un at-il utilisé?
  • Quelqu'un at-il essayé Python objet Partage (CHIC) module? Il semble prometteur à première vue, mais il est dans « Alpha » et ne semble pas être activement en cours d'élaboration.

Merci

Mise à jour: Nous avons ralenti le taux de mise à jour de données maximum à environ 10 Hz, mais plus généralement 1 Hz. Les clients ne seront informés lorsqu'une valeur change plutôt qu'à un taux de mise à jour constante. Nous sommes passés à un modèle plusieurs serveurs / clients multiples où chaque serveur est spécialisé dans un certain type d'instrument ou de la fonction. Comme il est avéré que la plupart de la programmation allait être fait par des programmeurs Java, nous avons fini par JSON-RPC sur TCP. Les serveurs wil être écrits en Java, mais j'espère écrire encore le principal client en Python et je suis enquête implémentations JSON-RPC.

Était-ce utile?

La solution

Une alternative à l'écriture des données dans un fichier dans le processus serveur peut-être écrire directement aux processus client:

Utiliser les sockets de domaine UNIX (ou sockets TCP / IP si les clients exécutent sur différentes machines) pour connecter chaque client au serveur, et ont l'écriture de serveur dans les prises. En fonction de votre modèle de traitement particulier, le choix d'un client / socket peut être effectué par le serveur (par exemple round-robin) ou par les clients de signalisation qu'ils sont prêts pour plus.

Autres conseils

Créer une partition ramfs et écrire à ce sujet. (Vous pouvez utiliser tmpfs, mais contrairement à tmpfs, ramfs n'est pas troqué le disque). Cependant, comme ramfs ne dispose pas d'une limite de taille, vous devez prendre soin que vous ne manquiez pas de mémoire; puisque vous êtes seulement écrire un tout petit peu de données là-bas, il ne devrait pas être un problème.

De cette façon, vos données ne sera jamais écrit sur un disque (note: vous les perdrez en cas de panne).

Voir aussi les ramfs docs .

Selon le article Wikipedia appel système mmap, la mémoire mappée contenu des fichiers sont écrites sur le disque lorsque mis à jour.

Avez-vous regardé le module de multitraitement (dans la bibliothèque standard) - en particulier la partie état de partage entre les processus

?

Ramfs comme mentionné par Piskvor semble également une bonne solution -. Surtout quand tous les processus sont écrits en Python

Lors de l'exécution sur les systèmes flash, assurez-vous que votre système de fichiers est conçu correctement pour maximiser la durée de vie de la mémoire flash (mise à niveau d'usure). JFFS et, je crois, d'autres sont maintenant capables de faire efficacement. Si vous utilisez un tel système, vous ne devriez pas être trop préoccupé par l'utilisation du flash, mais certainement si vous écrivez un flux constant de données que vous voudriez éviter de faire cela sur le flash.

L'utilisation d'un système de fichiers RAM est une bonne idée. Mieux encore est d'éviter entièrement si les systèmes de fichiers la conception du système vous permettra. À cette fin, vous mentionnez CHIC. Je ne l'ai jamais essayé, mais nous avons trouvé Pyro ( « PYTHON objets à distance » ) être une solution élégante et efficace dans certains cas similaires.

Et bien sûr, il y a le module multiprocessing de bibliothèque standard, qui comporte quelques similitudes en ce qui concerne la façon dont il communique entre les processus. Je commencerais là pour tout nouveau développement dans ce domaine, et d'aller ailleurs que si elle n'a pas réussi à se dérouler.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top