2010-01-05 4 views
14

Helllo, Ich möchte kleine Datenmengen (< 1K) zwischen Python und Prozesse teilen. Die Daten sind physische PC/104 IO-Daten, die sich schnell und oft ändern (24x7x365). Es wird einen einzelnen "Server" geben, der die Daten schreibt und mehrere Clients, die Teile davon lesen. Das System, auf dem es ausgeführt wird, verwendet Flash-Speicher (CF-Karte) und nicht eine Festplatte. Daher mache ich mir Sorgen, dass ich den Flash-Speicher mit einem dateibasierten Schema abnutzen könnte. Ich möchte auch weniger Energie (Prozessorzeit) verwenden, da wir zu 100% mit Solarenergie betrieben werden.So teilen Sie Daten zwischen Python-Prozessen, ohne auf Festplatte zu schreiben

  • Ist das eine berechtigte Sorge? Wir könnten möglicherweise die CF-Karte in eine SSD ändern.
  • Wird beim Ändern eines Werts mit mmap die Daten physisch auf die Festplatte geschrieben oder handelt es sich um eine virtuelle Datei?
  • Wir werden auf Debian laufen, also ist vielleicht das POSIX IPC für Python-Modul die beste Lösung. Hat jemand es benutzt?
  • Hat jemand das Python Object Sharing (POSH) Modul versucht? Es sieht auf den ersten Blick vielversprechend aus, ist aber in "Alpha" und scheint nicht aktiv entwickelt zu werden.

Danke

UPDATE: Ich verlangsamte die maximale Datenaktualisierungsrate auf etwa 10 Hz nach unten, aber typischen 1 Hz. Clients werden nur benachrichtigt, wenn sich ein Wert ändert, statt mit einer konstanten Aktualisierungsrate. Wir sind zu einem Modell mit mehreren Servern/mehreren Clients gegangen, bei dem jeder Server auf einen bestimmten Instrumententyp oder eine bestimmte Funktion spezialisiert ist. Da es sich herausstellte, dass die Programmierung hauptsächlich von Java-Programmierern durchgeführt wurde, verwendeten wir JSON-RPC über TCP. Die Server werden in Java geschrieben sein, aber ich hoffe immer noch, den Hauptclient in Python zu schreiben und JSON-RPC-Implementierungen zu untersuchen.

+1

+1 für python + solar powered. Genial. – gahooa

+1

Können Sie uns mitteilen, wie oft sich die Daten ändern und wie oft die Verbraucher aktualisiert werden müssen? Diese Information wird helfen, den besten Ansatz auszuwählen. – gahooa

+0

Einige Datenwerte können sich zweimal pro Sekunde ändern, während sich einige nur selten ändern. Es sieht so aus, als ob einige der anderen Prozesse Java sind, so dass ein Socket-Ansatz am besten aussieht. Ich denke, ich werde versuchen, etwas zu tun, wo ein Kunde (Verbraucher) sein Interesse an einem bestimmten Wert registriert (z. B. Motorstrom, Schalterstatus, Windgeschwindigkeit usw.) und der Server dem Client ein Update sendet, wenn sich der Wert ändert. Der Client kann auch eine Statusänderung für digitale Ausgänge anfordern. – RyanN

Antwort

8

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

Verwenden UNIX Domain Sockets (oder TCP/IP-Sockets, wenn die Clients auf unterschiedlichen Rechnern laufen) verbinden jeder Client an den Server und den Server in diese Sockets schreiben lassen. Abhängig von Ihrem speziellen Verarbeitungsmodell kann die Auswahl eines Client/Sockets durch den Server erfolgen (z. B. Round-Robin) oder durch die Clients, die signalisieren, dass sie für mehr bereit sind.

+0

Das habe ich mir gedacht (UD, oder TCP-Sockets). Sogar nur ein FIFO unter Unix erstellen. – richo

4

Erstellen Sie eine Ramfs-Partition und schreiben Sie darauf. (Sie könnten tmpfs verwenden, aber im Gegensatz zu tmpfs wird ramfs nicht auf die Festplatte ausgelagert). Da Ramfs jedoch keine Größenbeschränkung haben, müssen Sie darauf achten, dass nicht zu wenig Arbeitsspeicher zur Verfügung steht. Da Sie nur ein kleines bisschen Daten dort schreiben, sollte es kein Problem sein.

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

See also the ramfs docs.

2

Nach der Wikipedia article about the mmap system call, Speicherabbilddateien Inhalte werden auf Platte bei der Aktualisierung zurückgeschrieben.

Haben Sie sich das Multiprocessing-Modul (in der Standardbibliothek) angeschaut - besonders den Teil Sharing State zwischen Prozessen?

Ramfs wie von Piskvor erwähnt scheint auch eine gute Lösung - vor allem, wenn nicht alle Prozesse in Python geschrieben sind.

0

Wenn Sie mit Flash-Systemen arbeiten, vergewissern Sie sich, dass Ihr Dateisystem richtig ausgelegt ist, um die Lebensdauer des Flash-Speichers zu maximieren (Wear Leveling). JFFS und ich glaube, andere sind jetzt in der Lage, dies effektiv zu tun. Wenn Sie ein solches System verwenden, sollten Sie sich nicht zu sehr Gedanken über den Flash-Speicher machen, aber wenn Sie einen konstanten Datenstrom schreiben, sollten Sie dies auf dem Flash vermeiden.

Die Verwendung eines RAM-Dateisystems ist eine gute Idee. Besser ist es, Dateisysteme vollständig zu vermeiden, wenn das Systemdesign es Ihnen erlaubt. Zu diesem Zweck erwähnen Sie POSH. Ich habe es noch nie ausprobiert, aber wir haben Pyro ("Python Remote Objects") gefunden, um in einigen ähnlichen Fällen eine elegante und effektive Lösung zu sein.

Und natürlich gibt es die Standardbibliothek multiprocessing Modul, die einige Ähnlichkeiten in Bezug auf die Kommunikation zwischen Prozessen hat. Ich würde dort für jede neue Entwicklung in diesem Bereich beginnen und nur woanders hingehen, wenn es nicht klappt.