Wie bewerkstellig man am besten multiple Aufgaben die gleichzeigtig ausgeführt werden.

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Bl3nder
User
Beiträge: 139
Registriert: Freitag 3. Januar 2020, 17:07

Hallo Leute,

Ich hätte heute mal mehr eine Frage da Ich mir bei der Umsetzung nicht ganz sicher bin ( Ich habe bisher auch nur Programme die mehr einen Flussdiagramm ähneln -> also alles nacheinander.Ich habe folgendes Problem vor einigen Wochen ( mir wurde hier auch in dem Forum geholfen Stichwort "Frequenzmessung" ).Ich habe mehrere Sensoren einmal einen Windgeschwindigkeitssensor der einen Frequenzausgang hat,dann könnten noch Taupunktsensoren,Temperatursensoren und noch zwei drei andere kleine Sachen dazu kommen.
Das Skript für die Frequenzmessung ist im Prinzip einfach nur einwarten auf zustandswechsel an den GPIO das funktioniert alleine auch wunderbar,Ich habe mich dann mit diversen unterschiedlichen Sensoren die letzten Wochen beschäftigt von einem Luftqualitätsensor mit Bibliothek von Bosch bis einfach selber Messwert über ein A/D Wandler auslesen was ebenfalls alles funktioniert.So Ich möchte nun gerne das alles Gleichzeitig zusammenläuft. [Falls hier der Hinweis kommt wegen der niedrigen Taktzahl -> Ich werde wohl in geraumer Zukunft zumindest das Messdaten erfassen über einen Pico machen jedoch dauert das noch einige Monate].Also zum Beispiel Hintereinander mehrere Ich sag mal Temperatursensoren auszulesen ist kein Problem mich verunsichert in dem Fall nur die Frequenzmessung da Ich diese nicht behindern möchte.


Meine Gedanke zu dem Thema:
Ich habe damit zwar noch nie gearbeitet und mich nur sehr oberflächlich beschäftigt jedoch glaube Ich das hier nicht der richtige Einsatzmoment für Threads bzw Multithreading wäre.
Da diese Aufgaben ehr jeder sein eigenes "Bier" macht und sich somit auch nicht unbedingt Variablen teilen müssen macht es für mich mehr Sinn mehrere Prozesse zu denken ( wenn Ich das noch richtig im Kopf habe habe wäre das auch wieder ein Problem bei den Threas da mit Hyper Threading glaube Ich wieder nur zwei gleichzeitig laufen ? Also Ich assoziiere das man Threads zum Beispiel ehr bei GUIS etc benötigt aber das kann natürlich auch falsch sein.Ebenfalls finde Ich es Positive das Ich die Prozess quasi wie eigenständige Programme unterbrechen könnte wenn Ich zum Beispiel mal Wartungsarbeiten an dem Sensor machen muss.

Anderer Gedanke:
Ich habe es noch nicht ausprobiert nur im Endeffekt würde natürlich auch die Möglichkeit weiter bestehen für jede Aufgabe einzelne Skript zu erstellen und diese einfach "nebeneinander aufzurufen"-> was in dem Fall ja ein Hintereinander wäre,nur auch wenn Ich es noch nicht ausprobiert habe bin Ich mir sicher das es so nicht funktioniert wird das der Pi etwas Träge ist und da zuviele Sekunden verloren gehen würden.

Was haltet Ihr von der Problemstellung und wie würdet ihr an das Problem rangehen

Ich bedanke mich im voraus
Eine Vision ohne Aktion bleibe eine Illusion
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Sowohl __deets__ als auch ich haben Dir in Deinem anderen Beitrag Wege gezeigt, wie man Deine Frequenzmessung „parallel” zu anderen Dingen machen kann, also das Abfragen aller Sensoren nacheinander in einer Schleife.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Da geht einiges Durcheinander. GUIs vertragen sich genau NICHT mit threads. Und hyperthreading hat hier keinerlei Bewandtnis. Sondern ein Python Prozess kann nur EINEN Thread gleichzeitig laufen lassen, wegen des globalen Interpreter locks, GIL. Das ist aber nur bei CPU-intensiven Aufgaben ein Problem. Denn dann läuft eben immer nur ein Kern. Das liegt hier aber nicht vor. Ein weiterer Grund für threads kann deren Kontrollfluss sein, also die Parallelität. Und dadurch wären sie ggf ein Ansatz für dein Problem.

Mehrere Prozesse würde ich NICHT wählen, weil der Aufwand, die zu orchestrieren und die gewonnenen Daten dann gemeinsam zu sammeln das Problem unnötig verkomplizieren.

Leider zeigst du keinen Code für deine Frequenzmessung. Darum kann man nicht beurteilen, was genau da passiert. Vernünftig macht man das zb mit pigpio, weil das einen Zeitstempel für eine GPIO Ereignis vergibt. Und generell arbeitet man mit der Ereignis-basierten Variante der Erfassung, also kein warten. Die ist nämlich schon Multi-threaded, weil es anders nicht geht. In der Rückruffunktion Stopft man den Zeitstempel dann einfach in eine Queue & bearbeitet alles zusammen in der zentralen Hauptschleife.
Antworten