2017-11-16 2 views
0

Ich habe eine Funktion:Thema friert Programm

def threaded(fn): 
    def wrapper(*args, **kwargs): 
     thread = threading.Thread(target=fn, args=args, kwargs=kwargs) 
     thread.start() 
     return thread 
    return wrapper 

Und eine Klasse:

class someclass(somestuff): 
    def __init__(self, parent=None): 
     super(thing) 
     . 
     . 
     . 

    @threaded 
    def start_thread(self): 
     while True: 
      self.update_watchers() 

    def update_watchers(self): 
     . 
     . 
     . 

    def otherfunctions(self): 
     . 
     . 
     . 
     . 

Und in meinem Haupt:

obj = someclass() 
handle = obj.start_thread() 
handle.join() 

Nun, wenn ich nehme die while Schleife aus von start_thread, alles funktioniert gut. Ich vermute, dass ich forever-threads lang benutze (ein forever Thread ist natürlich ein Thread, der so lange läuft, wie das Programm läuft, natürlich).

Als eine FYI belegt dieses Programm eine Liste. Keine Python-Liste, keine GUI-Liste. Es untersucht eine Datei, die ständig aktualisiert wird. update_watchers() aktualisiert die Beobachter, die ich über die Datei laufen lasse, extrahiert Informationen, wenn (zum Beispiel) das Programm pausiert ist (was einer der vielen Gründe ist, warum ich einen Thread brauche).

Kann mir jemand erklären, was vor sich geht? Es bricht weiter, wenn ich die handle Definition erreiche. Ich weiß, dass ich die While-Schleife falsch verwenden muss, und es gibt einen richtigen Weg, dies zu tun. Ich brauche start_thread, um die ganze Zeit zu laufen, weil ich update_watchers die ganze Zeit laufen lassen muss.

Ich kann wirklich mehr Code als das post.

Danke

Edit: threaded Funktion von this post genommen

+0

Sie haben zu viel Code gepostet und gleichzeitig nicht genug. Entpacken Sie ein minimales, aber vollständiges Beispiel, da Ihre Frage off-topic ist. –

+1

Willst du was laufen lassen, während True: 'und dann diesen Thread irgendwo im Code stoppen? Wenn Sie möchten, dass dieser Thread vom Anfang bis zum Ende des Programms funktioniert, sollten Sie diesen Thread unterbrechen oder etwas wie [hier] machen (https://stackoverflow.com/a/36499538/4984268) – Iluvatar

+0

@Iluvatar Vielen Dank! Genau das würde ich als nächstes nachschlagen! – user3026388

Antwort

1

Der Aufruf von handle.join() wartet, bis die durch handle abgeschlossen ist vertreten Faden. Da es eine while True hat, wird es nie abgeschlossen, und damit wird die Verknüpfung nie beendet. Sie wollen fast sicher nicht join auf einen Thread, den Sie für immer ausführen möchten. Das Lösen Ihres Problems ist wahrscheinlich so einfach wie das Entfernen handle.join().

+0

Nun ... los gehts. Danke, Mann –

Verwandte Themen