Python Threading: Thread beenden und wieder starten

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

    Ich habe wieder ein Problem mit Python:lol:

    Diesmal möchte ich einen Worker Thread nach belieben starten, beenden und danach wieder starten können.

    Das starten und beenden bekomme ich auch grundsätzlich hin nur beim wieder starten bekomme ich eine Fehlermeldung.

    Ich hab hier mal meinen Beispielcode:

    Beim zweiten t_worker.start() bekkomme ich den Fehler: RuntimeError: threads can only be started once.

    Ich hab das Internet schon nach einer anderen Lösung zum beenden durchgesucht aber nichts gefunden das mein Problem lösen könnte.

    Gibt es da eine bessere Lösung oder soll ich gleich versuchen einen eigenen Prozess zu starten?

    Danke schonmal im Vorraus:danke_ATDE:

  • Python Threading: Thread beenden und wieder starten? Schau mal ob du hier fündig wirst!

  • Manul: ich habe den Coder probiert und er funktioniert auch, danke!

    Nur wird dann bei mir der Code nach dem 2. mal starten nicht mehr beendet (ja ich weiß oben fehlt der Teil) woran könnte das liegen?

    Und wieso lässt sich der Thread neu starten wenn man t_worker.stoprequest.clear() ausführt?

    noisefloor: Habe ein Paar Buttons an meinem Raspberry und die sollen ein paar Funktionen steuern. Wie z.B. einen Thread starten und stoppen können der sich unabhängig vom Rest des Programms um Aufgaben kümmert bis das nicht mehr gewünscht ist.

  • Hallo,

    FatCookie: wie du schon gemerkt hast, haben Threads in Python standardmäßig keinen Mechanismus zum Stoppen - weil man Threads normalerweise nicht stoppt. Das muss man selber als Work-Around implementieren. Dazu gibt's z.B. auch bergeweise Threads bei StackOverflow.

    Dein Antwort, was du vorhast, war offen gesagt ziemlich nichtssagend... "ein paar Funktionen steuern", "unabhängig vom Rest des Programms" - das kann alles und nichts heißen. Aber gut, wenn du nur vage Infos raus geben willst, dann wirst du dich auch damit abfinden müssen, nur vage Lösungen für dein Problem zu bekommen.

    Es sei noch so viel gesagt: Nebenläufigkeit kann man bei Python auch anders als mit Threads realisieren. Z.B über Coroutines oder ab Python 3.5 auch mit asyncio. Oder über was ganz anderes wie eine im Hintergrund laufende Task Queue. Ob das nicht die bessere Wahl ist hängt davon ab, was du vor hast.

    Gruß, noisefloor

  • Okey tut mir leid das waren zu wenig Infos. Mit den Buttons will ich in Verbindung mit einem LCD Display am Raspberry Pi einen Roboter steuern. Der Roboter fährt mir GPS und soll auf dem Weg Hindernissen automatisch ausweichen. Ich möchte nur am LCD einen Punkt auswählen können wo entweder "Roboter starten" oder "Roboter stoppen" steht und dafür wollte ich den Thread starten und stoppen können

    Wie schon oben beschreiben habe ich zwar schon einige Threads nach dem Thema durchgesucht aber ich weiß trotzdem noch nicht wie ich das am Besten machen soll.

  • Ich möchte nur am LCD einen Punkt auswählen können wo entweder "Roboter starten" oder "Roboter stoppen" steht und dafür wollte ich den Thread starten und stoppen können

    Das ist doch besser wenn dies über eine If-Abfrage geregelt wird?!

    "Roboter starten" --> freigabe = True

    "Roboter stoppen" --> freigabe = False

    Code
    if freigabe:
        print("Roboter im Betrieb") 
        ...  # Führe Ablauf aus
    else:
        print("Roboter hat Pause")

    EDIT: Und hierbei ist es dann wieder egal ob der Ablauf in einem seperaten Thread stattfinden soll oder nicht.

  • Ich hatte mich auch mal mit Threading im Rahmen einer einfachen Ampelsimulation beschaeftigt und dem Problem dass der nicht mehr zu stoppen ist. Dabei habe ich eine StoppableThread Klasse geschrieben (Siehe dazu hier). Aber wie noisefloor schon schrieb: Dazu findest Du auch diveres andere Loesungen im Netz.

Jetzt mitmachen!

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