Threads laufen zweimal mit Flask

Registriere dich jetzt, um exklusive Vorteile zu genießen! Als registriertes Mitglied kannst du Inhalte herunterladen und profitierst von einem werbefreien Forum.
Mach mit und werde Teil unserer Community!
  • An die Python Gemeinde,


    Im Beitrag Kann man den Inhalt einer Python variable nach PHP übergeben? habe ich erste Schritte mit Flask gemacht. Das funktioniert auch soweit.


    Nun bei der Umsetzung des gelernten habe ich das Problem, dass meine dazu gebauten Threads zweimal gestartet werden.

    Hier ein vereinfachter Code zur Demonstration und die dazugehörige Konsolenausgabe.


    Meine Frage: Woran liegt das? – in der Hoffnung einige Codezeilen zur Lösungsfindung zu bekommen.



    Konsolenausgabe:

  • Du startest zwei Threads, und die laufen dann. Was genau erwartest du das anders wäre?


    Und den Code zu kopieren, nur weil mal eine 1 und mal eine 2 drin vorkommt ist etwas sehr umständlich. Dazu einfach EINE Funktion mit Argument schreiben, und das Argument dem thread zum Start mitgeben.

  • In der finalen Version werden 8 Threads mit unterschiedlichen Aufgaben laufen – aber jeder Thread darf natürlich nur einmal existieren; nicht zweimal.

    Die gezeigte Version ist zu Demonstrationzwecken.

    Thread_1 startet zweimal und läuft auch zweimal. Dasselbe gilt für Thread_2

    E sieht so aus, dass der zweite Start der Threats nach der Flaskausgabe „Restarting with stat“ erfolgt.

  • ahh. Jetzt sehe ich das. Ich vermute stark das hat was mit deiner IDE oder ggf. dem Flask Server im debug modus zu tun. Versuch das mal über die Kommandozeile zu starten. Ggf mit disableten debugger. Und es ist auch ein schlechtes Vorgehen, threads einfach auf Modulebene zu starten. Mach das sauber in einer Funktion, und ruf die in main auf. Das kann darauf auch einen Einfluss haben.


    Und zu guter letzt: du machst garantiert einen Fehler, wenn du so viele threads laufen lassen willst. Maximal einer. Der muss dann ggf mehrere Aufgaben erledigen, aber ich verspreche dir, mit so vielen Threads verhedderst du dich.

    Edited once, last by MistyFlower59469 ().

  • Quote

    Versuch das mal über die Kommandozeile zu starten. Ggf mit disableten debugger.

    Super, klappt!


    Quote

    Und es ist auch ein schlechtes Vorgehen, threads einfach auf Modulebene zu starten. Mach das sauber in einer Funktion, und ruf die in main auf.

    Hm, ich bin nicht genug Pytonianer, um zu verstehen was du meinst. Mein Hauptprogramm besteht aus

    Try: hier werden all Threads gestartet und auch Flask

    Except: Keyboard Interrupts, ... abzufangen

    Finally: Um Gpios, Filehandler, ... zurückzusetzten

    Mit den Sachen ___main___ usw. kenne ich mich gar nicht aus. Ist das was mit objektorientierter Programmierung? (kenne ich nur als Schlagwort)


    Quote

    Und zu guter letzt: du machst garantiert einen Fehler, wenn du so viele threads laufen lassen willst. Maximal einer. Der muss dann ggf mehrere Aufgaben erledigen, aber ich verspreche dir, mit so vielen Threads verhedderst du dich.

    Die Treats laufen alle autark. Einzige Schnittmenge is das loggen.


    Quote

    statt das "OK" auf oberster Ebene zu nutzen solltest du threading.Event benutzen, um den Thread etwas "mitzuteilen". Der ist der besserer und sauberer Weg.

    Die OK Methode hat mich auch schon immer gestört, kannte bisher keine Alternative. Dasmit dem threading.Event schaue ich mir mal genauer an.

  • Mit Objekt Orientierung hat das nichts zu tun. Nur mit Ordnung und Klarheit. Man kann die Stromleitung diagonal durch die Wand ziehen. Macht man aber nicht. Code der auf Modul-Ebene steht macht Probleme. Weil man nicht entscheiden kann, wann der läuft. Und das kann dann schnell in die Hose gehen. Darum schreibt man Funktionen und ruft die kontrolliert auf.


    Und ich bezweifle immer noch, dass du 8 Threads brauchst. Was machen die denn genau?

  • Hier mal zum reinschauen: http://91.67.114.141/page_hydr…ge_hydraulischer_plan.php


  • Na der entscheidende Teil wäre ja zu sehen, was die Threads wirklich TUN. Ob die sich dabei nicht in die Quere kommen, bzw. so viele sein müssen.

  • Hallo,


    du nutzt noch Python 2 - das ist seit dem 1.1.2020 ohne Support durch die Entwickler von Python. D.h. du solltest dringend auf Python 3 umstellen.


    • Der gezeigte Code ist doch gar nicht lauffähig, weil in Zeile 50 das `OK` nicht definiert ist.
    • Alles ab Zeile 80 wird nicht ausgeführt, weil davor ein `sys.exit()` steht.
    • `os.system` in Zeile 72 ist veraltet, `subprocess` ist Stand der Dinge.
    • Wenn der `except` Block betreten wird, wird der `finally` Block nicht ausgeführt, weil das `os.system("reboot")` den Programmfluss an der Stelle stoppt.
    • Nackte `except` sind fast immer falsch, weil du damit _alle_ Fehler abfängst, auch Programmierfehler. Will man aber in der Regel gar nicht, weil das zu unerwarteten und nicht nachvollziehbaren Verhalten des Programms führen kann.

    Kurz: da ist noch erhebliches Verbesserungspotential...


    Gruß, noisefloor