Seite 1 von 1

Inhalt einer Liste überwachen und bei Änderung reagieren

Verfasst: Donnerstag 4. Oktober 2018, 07:27
von Tinker232
Moin zusammen,
gibt es eine Möglichkeit die Werte einer Liste zu überwachen und bei einer Änderung entsprechend reagieren.

Folgendes habe ich mir dazu überlegt:
Mein Datenaufzeicher hat bsp. für jeden Sensor einen Thread der in seinem bestimmten Intervall von x Sekunden die Daten ausliest und sie dann an die Stelle Y in eine Liste schreibt.
(Jeder Sensor(Thread) eine andere Stelle Y in der gleichen Liste).
Sobald sich nun ein Wert in dieser Liste ändert, soll die gesamte Liste in eine CSV-Datei geschrieben werden, bzw. einer CSV-Datei angehängt werden, inklusive eines Zeitstempels.
Sprich es soll eine Auswertdatei erstellen und immer bei Änderung eines Sensorwertes die gesamte Liste als Messpunkt aller Sensoren hinzugefügt werden. Das bedeutet natürlich das meine maximale Schreibgeschwindigkeit immer von dem Sensor abhängt der das kleinste Intervall hat und ich so sicher viele Gleiche Werte für Sensoren mit langem Intervall bekomme.
siehe Skizze
Bild

Eine Alternative wäre dann, dass die Sensor-Threads direkt Ihren Wert in diese CSV-Datei schreiben, sobald das Intervall erreicht ist. Dann hätte man jedoch das Problem, dass man man immer nur einen Wert zu einem bestimmten Zeitwert hat und die Liste unheimlich groß wird, weil jeder Sensor in eine eigene Zeile schreibt... Weshalb es vermutlich besser ist das Schreiben der CSV Auszulagern und zentral zu der Zeit zu machen, sobald sich ein Wert in der Liste ändert :-)
Was wäre aber wenn zwei Threads zur gleichen Zeit Werte in der Liste verändern, eventuell müsste man dann eher ein festes Zeitinvervall machen um die Werte zu schreiben damit es keine Konflikte gibt?

LG TINA

Re: Inhalt einer Liste überwachen und bei Änderung reagieren

Verfasst: Donnerstag 4. Oktober 2018, 07:40
von noisefloor
Hallo,

warum schreibst du die Werte nicht in eine Datenbank (z.B. SQLite), dann hast du die Probleme nicht. Z.B. so:
Tabelle "sensor" besteht aus den Spalten "sensor_id" und "sensor_description", Tabelle "data" besteht aus den Spalten "sensor_id" (als Fremdschlüssel auf Tabelle "sensor"), "value" und "timestamp". Dann hast du die Daten schön strukturiert, kannst beliebig abfragen und aggregieren.

BTW: wenn du den Zeitstempel mit maximaler Präzision in die Liste schreibst, kannst du nie doppelte Zeitstempel bekommen, bei zumindest bei CPython zwei mit Bordmitteln erzeugte Threads nie wirklich gleichzeitig laufen können (Stichwort: GIL). Wenn du auf Sekunden rundest vielleicht schon, wobei die ja keine Garantie hast, dass innerhalb einer Sekunde alle vier Threads abgearbeitet werden. Wenn der Rechner schnell genug ist, ist das zwar sehr wahrscheinlich, aber eben nicht garantiert.

Gruß, noisefloor

Re: Inhalt einer Liste überwachen und bei Änderung reagieren

Verfasst: Donnerstag 4. Oktober 2018, 07:44
von __deets__
Du hast schon mal ein Missverständnis: in beiden deiner Szenarien hast du genau gleich viele Daten. Bestenfalls sogar weniger wenn jeder sensor schreibt, weil ja die anderen Daten leer sind. Dafür aber ist die Verarbeitung dann hässlich.

Die Lösung ist einfach: ein extra schreib-Thread. Der bekommt eine Queue aus dem gleichnamigen Modul, und alle Sensor-Threads schreiben ihren aktuellen Wert da hinein. Der schreib-Thread wartet mit
Queue.get auf das eintreffen eines neuen Wertes. Er schreibt den neuen Wert dann in eine Liste mit den Werten aller Sensoren, und schreibt die wiederum als Ganzes raus.

Re: Inhalt einer Liste überwachen und bei Änderung reagieren

Verfasst: Donnerstag 4. Oktober 2018, 12:26
von Tinker232
Hey,
ich habe mir jetzt schon einiges durchgelesen zu Queues, kann es aber noch nich ganz auf meine Problemstellung implizieren...
Ich denke ich hab noch Verständnisprobleme mit queues. In einem Buch ist von einem Producer Consumer Pattern die Rede, welches ja eigentlich zu meiner Aufgabenstellung passen würde (Producer = Sensoren, Consumer = SchreibThread), aber ganz so durchsteigen konnte ich da jetzt nicht...

Mit dem put kann ich also in die Schlange etwas einfügen, das würde also jeder Thread nach Ablauf seines Intervalls tun, oder?
Und der SchreibThread?
Woher weiß er denn die Beziehung zwischen den Daten und den Sensoren? Denn er muss diese doch an eine bestimmte Stelle in der Liste hinzufügen, sodass die Daten auch eindeutig zugeordnet werden können und nicht plötzlich Temperaturwerte bei den Stromwerten stehen, oder?

Mhhh, vielleicht hast du noch ein Beispiel für mich? :oops:
LG

Re: Inhalt einer Liste überwachen und bei Änderung reagieren

Verfasst: Donnerstag 4. Oktober 2018, 12:34
von __blackjack__
@Tinker232: Der Schreib-Thread muss die Zuordnung aus den Daten machen können die er über die Queue bekommt. Da darf dann nicht einfach nur eine Zahl, also das Messergebnis drin stehen, sondern eben zum Beispiel auch von welchem Sensor diese Information kommt. Man kann beliebige Objekte in so eine Queue stecken, also nicht nur einzelne Zahlen, sondern auch Tupel, Wörterbücher, `collections.namedtupel`-Objekte, oder gar Werte von selbst geschriebenen Datentypen.

Wobei diese Variante das immer alle Daten geschrieben werden, auch wenn sie sich gar nicht verändert haben, ziemlich viel unnötige Daten schreibt, und man zudem auch nicht mehr erkennen kann ob eine Messung den gleichen Wert wie bei der letzten Messung ergeben hat, oder ob das einfach nur eine redundante Wiederholung war. Beziehungsweise bei solchen Einträgen dann gar nicht mehr feststellen kann *welcher* Sensor für die duplizierte Zeile verantwortlich war. Ich würde das ja nicht so machen.

Re: Inhalt einer Liste überwachen und bei Änderung reagieren

Verfasst: Donnerstag 4. Oktober 2018, 13:07
von __deets__
Du kannst doch in die Queue schreiben, was du willst. Wenn du nur einen blanken Wert schreibst, dann kann der natuerlich nicht zugeordnet werden. Aber schon ein Tupel aus Name und Wert, oder Index und Wert, und du hast alles was du brauchst.