2017-05-26 9 views
0

Das Problem ist relativ einfach nur, dass ich keine Antwort mit einer Google-Suche nach Begriffen gefunden:Wie beendet man Threads in Python auf Raspberry Pi 3?

in Fäden etc
  1. Wie beenden Threads in Python
  2. Wie beenden while-Schleife mit Tastatureingabe

So Format des Programms ist dies:

import everything necessary 

def readingsomething(): 
     DOING SOME WORK in a infinite while loop and sleep for 1 sec 

def readingsomeotherthing(): 
    DOING SOME WORK in a infinite while loop and sleep for 2 sec 

thread1 = thread.thread(target = readingsomething) 

thread2 = thread.thread(target = readingsomeotherthing) 

try:  
    thread1.start() 
    thread2.start() 

    thread1.join() 
    thread2.join() 

except KeyboardInterrupt: 

    save a file and sys.exit() 

Also, wenn ich das Programm e laufen lles ist glatt, außer wenn ich drücken ctrl + c es nicht abschließt, pro KeyboardInterrupt

ich die Daten verliere gesammelt, wie ich bin nicht in der Lage, sie zu retten.

Alle Vorschläge und Hilfe werden geschätzt.

+0

Hallo, willkommen Überlauf zu stapeln. Bitte achten Sie darauf, [korrekte Formatierung] (https://stackoverflow.com/editing-help#code) beim Posten zu verwenden, damit Ihr Code für die Leute, die Ihnen helfen werden, einfacher zu lesen ist. –

+1

fügen Sie Ihren Code bitte richtig ein - wie Sie es ausführen. Und was genau ist das Problem? –

+0

Der Code kompiliert ohne Fehler und führt aus, aber es sollte nur durch Drücken von Strg + C beendet werden, aber es hört nicht auf und weiter ausgeführt Ich denke, es ist ein Problem aufgrund von Schlafbefehle in den Funktionen –

Antwort

0

Es ist ziemlich unklar, was Sie zu tun versuchen. Sie sprechen von Schleifen, aber ich sehe keine in Ihrem Code.

Auch so geschrieben, werden Sie zuerst warten, bis Thread1 zu stoppen, dann warten Sie auf Thread2 zu stoppen, stellen Sie sicher, es ist was Sie wollen.

Setzen Sie ein Timeout innerhalb dieses ‚nachziehens‘ nennt, sonst verhindert es das Hören von Ausnahmen:

thread1.join() 

wird

thread1.join(10) 

Vielleicht möchten Sie über die Veränderungen denken, dass es auf Ihrem Code induziert .

+0

Vielen Dank für den Vorschlag, ich werde es versuchen . Die Schleifen sind in der Funktion definiert. –

0

Sie könnten die synchronisierte Warteschlange Queue als eine Pipe verwenden, um einen Wert an den Thread zu senden.

0

Arbeits Python 3 Beispiel:

from threading import Thread, Event 
import time 

def readingsomething(stop): 
    while not stop.isSet(): 
     print('readingsomething() running') 
     time.sleep(1) 

def readingsomeotherthing(stop): 
    while not stop.isSet(): 
     print('readingsomeotherthing() running') 
     time.sleep(2) 

if __name__ == '__main__': 
    stop = Event() 
    thread1 = Thread(target=readingsomething, args=(stop,)) 
    thread2 = Thread(target=readingsomeotherthing, args=(stop,)) 
    thread1.start() 
    thread2.start() 

    try: 
     thread1.join() 
     thread2.join() 
    except KeyboardInterrupt: 
     print('catched KeyboardInterrupt') 
     stop.set() 
     #save the file 

    print('EXIT __main__') 

mit Python getestet: 3.4.2

+0

Vielen Dank für den Vorschlag, ich werde das ausprobieren. –

+0

Da ich python3 verwende, Schlüssel = Eingang ('Presse Strg + C zu beenden') wird Schlüssel = eval (Eingabe ('drücken Ctl + c zu beenden'), aber ich bekomme ungültige Syntaxfehler auf c, ich versuche zu finden, warum –

+0

@PradeepBV: Meine Antwort mit Arbeitsbeispiel aktualisiert – stovfl