Python Thread

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
log111
User
Beiträge: 1
Registriert: Freitag 19. Mai 2017, 22:56

Hallo zusammen,

ich habe ein Problem und ich hoffe ihr könnt mir weiterhelfen...

der Fall: ich habe ein Pythonscript, dieses Script hat 1 Funktion die direkt ausgeführt wird und die in einer Schleife läuft und auf Anfragen reagiert..., es passiert aber das das Script abschmiert. Nun habe ich mir überlegt, dass ich eine 2te Funktion schreibe die prüft ob die erste Funktion läuft und wenn nicht, soll diese dann erneut gestartet werden. Ich habe die erste Funktion in ein Thread gepackt und die 2te in einen anderen Thread gepackt, die überprüft ob der erste Thread läuft. Das funktioniert soweit..., aber wenn der erste Thread abschmiert, bekommt der 2te Thread es mit und soll den ersten erneut starten, das geht aber nicht, Python meldet, dass ein Thread nicht ein zweites mal gestartet werden kann...

Mein vorhaben in kürze, ich will 2 Threads haben, wobei der 2te den ersten überwacht, und wenn der 1te abschmiert, dass der 2te den erneut startet...

Habt ihr eine Idee wie ich das am besten umsetzen kann?


l.
BlackJack

@log111: Das klingt alles ein wenig kompliziert. Und nach einem, wenn nicht gar zwei Threads zu viel. Wenn im ersten Thread die Funktion ausgeführt wird, und in dem zweiten eine Funktion die den ersten überwacht, was macht dann eigentlich der Hauptthread des Programms?

Du brauchst doch eigentlich gar keinen Thread starten, sondern nur eine Endlosschleife mit dem Funktionsaufruf und Ausnahmebehandlung. Am besten kombiniert mit dem `logging`-Modul, um die Ausnahme zu protokollieren vor dem erneuten Aufruf der Funktion, damit man eine Chance hat herauszufinden warum die Funktion ”abschmiert” und da eventuell sinnvoller drauf zu reagieren.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

log111 hat geschrieben:ich habe ein Pythonscript, dieses Script hat 1 Funktion die direkt ausgeführt wird und die in einer Schleife läuft und auf Anfragen reagiert..., es passiert aber das das Script abschmiert.
Es wird wohl nicht der Fall sein, dass das Script abschmiert. Denn abschmieren sieht in Python so aus, dass Du eine Exception bekommst und dann Ende. Das Programm wird wohl hängen. Und es hängt wohl in einer Endlosschleife. Am Besten machst Du in so einem Fall eine globale Variable. Und in die schreibst Du einen String hinein, der aussagt, was das Programm gerade macht. Am besten geschieht das vor jeder Schleife und auch danach, wahrscheinlich hast Du nicht nur die eine, sondern auch andere. Und zur Überwachung kannst Du einen Thread einsetzen, der dann in Zeitabständen irgendwo ausgibt, was in dieser Variablen steht. Sollte aber ein threadsicherer Zugriff sein. Und wenn das Hauptprogramm dann hängt, dann weiß man wenigstens wo.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@log111: Wie äußert sich denn das "abschmieren" Deines Programms? Vor einer möglichen Lösung liegt zunächst die Fehlersuche.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@log111: statt die Schleife neu zu starten, solltest Du die Ursache des Abschmierens finden und beheben.

@Alfons Mittelmeyer: so wie der Thread-Ersteller schreibt, wird das Programm wohl schon abschmieren, sonst hätte er keine Probleme, beim Neustarten des Threads. Beim Hängen würde ein einfaches Strg+C reichen, denn das löst an der Stelle an der das Programm zu diesem Zeitpunkt hängt einen KeyboardInterrupt aus, so dass man am Traceback erkennen kann, wo.
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@log111: welches Betriebssystem verwendest du? Wenn du ein (nicht zu altes) Linux verwendest, kann dann du dein Python-Skript über eine systemd Service Unit starten und neu Starten lassen. Da brauchst du da Rad nicht neu erfinden. Äquivalente Lösungen gibt's aber sicherlich auch für Windows uns MacOS.

Wobei das "nur" Plan B ist - wie oben schon gesagt sollte das Skript ja idealerweise _nicht_ abschmieren. Vielleicht möchtest du das Skript zwecks besserer Fehlersuche mal hier posten? :-)

Gruß, noisefloor
Antworten