Frage zum Threading

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
maksimilian
User
Beiträge: 86
Registriert: Freitag 2. November 2018, 20:59

Hallo Ihr,

ich hatte mein Projekt im Thread "Pi und Interprozesskommunikation" bereits kurz vorgestellt. In dem werden für Türen Getriebemotoren und Magnetschalter betrieben, die über ein 12V Netzteil versorgt werden, welches an 230V hängt. Da Tür-Aktionen nur 2x am Tag geschehen, möchte ich das 12V Netzteil nicht durchgehend an den 230V hängen lassen. Wenn eine Tür-Aktion (z,B. Öffnen) ausgelöst wird, soll das Netzteil eingeschaltet werden. Das erfolgt über ein Solid State Relay. Es ist nicht vorauszusehen, wieviele Tür-Aktionen hintereinander erfolgen werden. Es soll aber vermieden werden, nach jeder Aktion das Netzteil ab- und bei der nächsten Aktion wieder einzuschalten. Deshalb soll das Einschalten des Netzteils der Einfachheit halber in einem parallelen Prozess geschehen und nach einer bestimmten Zeit abgeschaltet werden.
Jetzt meine Frage: Sollte der parallele Prozess in einem eigenen Thread laufen oder gibt es dafür andere Möglichkeiten der Parallelisierung. Eine wesentliche Anforderung meinerseits ist, den parallelen Prozess stoppen und neu starten zu können. Angeblich kann ein Thread nicht gestoppt werden. Ein zweiter Start des gleichen Threads ist ja dann per Definition nicht möglich.

maksimilianBild
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist viel zu kompliziert gedacht. Du erzeugst künstlich Parallele Agenten, denen du dann mühselig irgendwie Herr werden musst.

Schreib EIN Programm. Das läuft die ganze Zeit. Wenn es abstürzt, wird es automatisch neu gestartet. Dazu eigenen sich systemd-Units. Es kennt die Betriebszeiten, und schaltet die Stromversorgung ein, wenn die erreicht sind. Und wieder aus. Und du kannst auf den Zustand der Tür einwirken, via IPC.

Intern kann dieses Programm mit threads arbeiten, um seine Teilaufgaben zu lösen. Dabei würde ich die Steuerung des Netzteils in einen thread auslagern, weil dessen Funktion orthogonal zum Rest des Programmes ist. Und im main Thread auf Kommunikation via socket (ob Unix Domain oder TCP/IP ist ziemlich Latte) warten. Und dann schalten.
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

Für sowas verwendet man weder Prozesse noch Threads noch sonst irgendetwas, was schwer zu durchschauen ist. Mal Dir als erstes einen Graphen, in dem Du alle Zustände und die Übergänge dieser Zustände aufschreibst. Und genau so programmierst Du das dann auch. Eine Hauptprogramm, das in einer Schleife Events aus einer Queue fischt und entsprechend von einem Zustand in den anderen schaltet.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Naja. Wenn du eine Queue brauchst, dann hast du deine threads ja wieder durch die Hintertür drin. Auf die zu verzichten würde bedeuten, sich mit asyncio oder ähnlichem auseinander zu setzten. Und das denke ich ist eine Nummer zu hoch.

Und auch wenn Zustandsautomaten toll sind, würde ich hier nicht darauf bestehen, die auszumultiplizieren.
Antworten