Frage

Helllo, Ich mag kleine Datenmengen (<1 K) zwischen Python und Prozessen teilen. Die Daten sind physikalische PC / 104-IO-Daten, die sich schnell und oft (24x7x365) ändert. Es werden die Daten und mehrere Clients zu schreiben Lese Teile davon ein einzelner „Server“ sein. Das System dies läuft auf nutzt Flash-Speicher (CF-Karte) statt einer Festplatte, so dass ich mache mir Sorgen um den Flash-Speicher mit einem dateibasierten Schema verschleißen. Ich würde auch gerne weniger Energie verwenden (Prozessorzeit), da wir 100% solarbetrieben sind.

  • Ist dies eine gültige Sorge? Wir könnten möglicherweise die CF-Karte auf eine SSD ändern.
  • Ist ein Wert unter Verwendung von mmap Ändern physisch die Daten auf die Festplatte schreiben, oder ist dies eine virtuelle Datei?
  • Wir werden auf Debian laufen so vielleicht die POSIX IPC für Python-Modul ist die beste Lösung. Hat jemand es verwendet?
  • Hat jemand versucht, die Python Object Sharing (POSH) Modul? Es sieht vielversprechend auf den ersten Blick, aber es ist in „Alpha“ und scheint nicht aktiv weiterentwickelt werden wird.

Danke

UPDATE: Ich verlangsamte die maximale Datenaktualisierungsrate auf etwa 10 Hz nach unten, aber typischen 1 Hz. Die Kunden werden nur benachrichtigt, wenn ein Wert ändert sich nicht bei einer konstanten Aktualisierungsrate. Wir haben zu einem mehr Server / mehrere Clients Modell gegangen, wo jeder Server in einer bestimmten Art von Gerät oder Funktion spezialisiert ist. Da es stellte sich heraus, dass die meisten der Programmierung von Java-Programmierer getan werden würde, am Ende haben wir mit JSON-RPC über TCP auf. Die Server in Java geschrieben werden wil aber ich hoffe immer noch das Haupt Client in Python zu schreiben und bin Untersuchung JSON-RPC-Implementierungen.

War es hilfreich?

Lösung

Eine Alternative, die Daten zum Schreiben in dem Server-Prozess die Datei möglicherweise direkt zu den Client-Prozessen schreiben:

Verwenden UNIX Domain Sockets (oder TCP / IP-Sockets, wenn die Clients auf unterschiedlichen Rechnern laufen), um jeden Client mit dem Server zu verbinden, und haben die Server Schreiben in diesen Sockeln. Abhängig von Ihrem speziellen Verarbeitungsmodell, eine Client / Buchse Auswahl kann durch den Server (z Round-Robin) oder durch die Kunden erfolgen signalisiert, dass sie bereit für mehr ist.

Andere Tipps

Erstellen Sie eine ramfs Partition und schreiben, dass. (Sie könnten tmpfs benutzen, aber im Gegensatz zu tmpfs wird ramfs nicht auf die Festplatte ausgelagert). Doch wie ramfs keine Größenbeschränkung haben, müssen Sie darauf achten, dass Sie nicht über genügend Arbeitsspeicher ausgeführt; da Sie nur sind dort ein klein wenig Daten zu schreiben, sollte es kein Problem sein.

Auf diese Weise Ihre Daten werden nicht immer auf einen Datenträger (Anmerkung: Sie werden sie verlieren, wenn der Strom ausfällt) geschrieben werden.

Siehe auch die ramfs docs .

Nach dem Wikipedia-Artikel über den Systemaufruf mmap , kartiert Speicherdateien Inhalt zurück auf die Platte geschrieben , wenn aktualisiert.

Haben Sie auf dem Multiprocessing-Modul sehen (in Standard-Bibliothek) - insbesondere den Teil-Sharing Zustand zwischen Prozessen

?

ramfs wie Piskvor erwähnt scheint auch wie eine gute Lösung -. Vor allem, wenn nicht alle Prozesse in Python geschrieben werden

Wenn auf Flash-Systemen ausgeführt wird, stellen Sie sicher, dass Ihr Dateisystem ausgelegt ist, richtig die Lebensdauer des Flash-Speicher (Wear Leveling) zu maximieren. JFFS und, glaube ich, andere sind jetzt in der Lage dies effektiv zu tun. Wenn Sie ein solches System verwenden, sollten Sie nicht allzu besorgt über das Blitzlicht verwendet, aber sicherlich, wenn Sie einen konstanten Strom von Daten gerade schreiben würden Sie tun, dass Sie den Blitz zu vermeiden.

ein RAM-Dateisystem ist eine gute Idee. Noch besser wäre es ist Dateisysteme vollständig zu vermeiden, wenn das System-Design werden Sie lassen. Zu diesem Zweck erwähnen Sie POSH. Ich habe nie versucht es, aber wir haben gefunden Pyro ( „python Remote-Objekte“ eine elegante und effiziente Lösung in einigen ähnlichen Fällen) sein.

Und natürlich gibt es die Standardbibliothek multiprocessing Modul, das einige Ähnlichkeiten hinsichtlich trägt, wie sie kommuniziert zwischen Prozessen. Ich würde es in diesem Bereich für jede neue Entwicklung starten, und gehen Sie woanders nur, wenn es scheiterte aus zu schwenken.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top