Threading und Multiprocessing

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo zusammen,

    wir (meine Tochter und ich) planen einen Wetterballon zu starten. Der Ballon nimmt einen Raspi B+ und folgende Aufzeichnungs- / Messgeräte mit:
    - Das Kameramodul
    - Einen BMP180 zur Druckmessung
    - Zwei DS18B20 zur Messung der Außentemperatur und der Temperatur in der Sonde
    - Ein höhentaugliches GPS

    Die Messdaten und die File-Namen der Fotos sollen in eine mySQL-Datenbannk geschrieben werden. Ich bin Python-Anfänger und stelle mir vor jedes Gerät in einem eigenen Prozess oder Thread laufen zu lassen. Welche Methode wäre Eures Erachtens sinnvoller, speziell im Hinblick auf das "Endziel" mySQL-Datenbank? Ein Datenaustausch zwischen den einzelnen Threads oder Prozessen ist nicht erforderlich.

    Schönen Dank für Eure Tips.

    Gruß
    Philipp

  • Rein von deiner Beschreibung her fallen mir zwei Dinge ein:

    • Wenn die "Threads" eh nicht miteinander kommunizieren sollen, würde ich diese einfach auf unterschiedliche Programme auslagern und die Aufgabe der Prozessverteilung dem Betriebssystem überlassen. Konkret: Statt in "Threads" einfach in "Programmen" denken. Solange man sich nicht irgendwelche Vorteile von Threading verspricht, ist mMn. der Aufwand zu groß, sich da einzuarbeiten... (und Threading bringt halt hauptsächlich dann Vorteile, wenn einerseits die Rechenleistung eines Prozessors nicht ausreicht und andererseits die Threads miteinander kommunizieren sollen...)
    • Stichwort Speicherung: Idealerweise könntest du dein Programm so schreiben, dass du die Funktionen zum Speichern und Laden nachträglich austauschen könntest. Python bietet mit der [font="Courier"]import [quelltextname] as [importname][/font]-Methode eine sehr schöne Möglichkeit, Quelltext nachträglich auszutauschen, ohne dass man im Rest des Quellcodes die ganzen Querverweise mitändern muss. Konkret: Du könntest z.B. zum "Speichern" erstmal eine Funktion schreiben, die nur die zu speichernden Daten auf der Konsole ausgibt. Das ist natürlich kein richtiges Speichern - aber du kannst sehen, ob die Funktion korrekt arbeitet. Und wenn es das tut, kannst du die Speicher-Funktion ausbauen... Dasselbe gilt natürlich auf für eine "Laden"-Funktion...


    Alles hängt aber, wie bereits gesagt, vom eigenen Kenntnisstand ab. Aber ganz generell gesagt: Als Python-Anfänger würde ich - ganz ehrlich - die Finger von Threading lassen. Das ist alles andere als leichte Kost^^...

    Wikipedia vermittelt auch einen Eindruck davon, wie schwierig Threading eigentlich ist.

  • Ich habe bereits für jeden Sensor und für die Kamera (bis auf das GPS, das habe ich noch nicht) eigenständige Programme geschrieben, die auch funktionieren. Gibt es eine Möglichkeit diese Programme gleichzeitig laufen zu lassen? Und können sich diese Programme, sofern sie parallel ausgeführt werden können, beim Schreiben in die Datenbank gegenseitig in die Quere kommen?

  • Gibt es eine Möglichkeit diese Programme gleichzeitig laufen zu lassen?

    Ich glaube, ich habe irgendwas verpasst. Warum sollten die Programme nicht gleichzeitig nebeneinander laufen können? :s

    Zitat

    Und können sich diese Programme, sofern sie parallel ausgeführt werden können, beim Schreiben in die Datenbank gegenseitig in die Quere kommen?

    Nein, genau das wird von der Datenbank ja abgefangen. In diesem Punkt wirds mit *SQL-Datenbanken keine Probleme geben...

  • Hallo,


    Gibt es eine Möglichkeit diese Programme gleichzeitig laufen zu lassen?

    Klar. Wenn du fünf verschiedene Python-Programe hast, kanns du die von 5 Terminals aus starten. Dann laufen die Parallel, ohne was voneinander zu wissen.

    Da deine Messungen oder IMHO nicht zeitkritisch sind (also es kommt auf ein paar Millisekunden mehr oder weniger bei der Messwerterfassung nicht an), kannst du auch alle Messungen sequentiell in einem sich wiederholenden Loop speichern.


    Und können sich diese Programme, sofern sie parallel ausgeführt werden können, beim Schreiben in die Datenbank gegenseitig in die Quere kommen?


    MySQL kann mehrere Schreibzugriffe auf einmal verarbeiten (bzw. organisiert sich da intern). Einen Fehler, denn man beim Programmieren grundsätzlich machen kann ist, dass man geöffnete Verbindungen nicht sauber wieder schließt. Dann ist die Datenbank irgendwann nicht mehr erreichtbar, weil jede Datenbank nur X Verbindungen gleichzeitig haben kann.

    Alternativ kannst du die Daten auch in einen CSV-Datei schreiben. Das kann Python ootb. Hätte den Vorteil, dass du sich nicht noch mit SQL und Python -> MySQL beschäftigen musst. Und dein Raspi würde nicht noch mit den MySQL Prozessen "belastet".

    Gruß, noisefloor

  • Das mit den fünf Terminalfenstern dürfte für mein Projekt nicht zielführend sein. Die Programme sollten nach dem Booten laufen. Wenn wir den Ballon steigen lasen, haben wir ja keine Möglichkeit fünf Terminalfenster zu öffnen.
    Eine Schleife in der alle Messungen und Fotos sequenziell abgearbeitet werden, wäre meine ultima ratio. Der Grund dafür ist, dass ich die Messungen eigentlich jede Sekunde durchführen wollte. Die beiden DS18B20 bremsen diesen Zyklus aber deutlich herunter, sodass ich gerne alle alle anderen Messungen/Fotos separat jede Sekunde ausführen lassen möchte und die beiden DS18B20 einfach ohne Wartezeiten durchschleife.
    Wäre es eine sinnvolle Möglichkeit die Programme mit '&' verbunden in der /etc/rc.local ausführen zu lassen?
    Den Datenbankzugriff traue ich mir zu.

  • Hallo,


    Das mit den fünf Terminalfenstern dürfte für mein Projekt nicht zielführend sein. Die Programme sollten nach dem Booten laufen. Wenn wir den Ballon steigen lasen, haben wir ja keine Möglichkeit fünf Terminalfenster zu öffnen.

    Das war auch nur das Beispiel. Du kannst natürlich auch alle fünf Skripte per Autostart starten lassen.


    Die beiden DS18B20 bremsen diesen Zyklus aber deutlich herunter,


    Wieso das?

    Gruß, noisefloor

  • Der Messvorgang dauert laut Datenblatt 750ms für einen DS18B20 bei 12bit Auflösung. Wenn ich beide Sensoren nach einander messen lasse, bin ich bei 1,5s. Man kann zwar die Auflösung herunter setzen, dann wären schnellere Messungen möglich, aber das Raspbian-Modul w1.therm scheint fix auf 750ms pro Sensor eingestellt zu sein, so dass ein Herabsetzen der Auflösung nichts bringt.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!