Seite 1 von 1

Thread zerstoeren

Verfasst: Dienstag 10. April 2007, 20:33
von Costi
wenn ich die instanz eines aktiven threading.Thread habe, wie kann ich diesen thread zerstoeren
(also, wie beende ich einen thread mithilfe meines zugriffs auf seine instanz?)


danke

Verfasst: Dienstag 10. April 2007, 21:16
von BlackJack
Threads kann man von "aussen" nicht beenden, das muss der Thread schon von sich aus machen. Üblicherweise benutzt man ein Attribut das man von aussen setzen kann und auf das der Thread ab und zu testet und sich gegebenenfalls beendet.

Verfasst: Mittwoch 11. April 2007, 08:25
von EyDu
Das sieht dann üblicherweise so aus:

Code: Alles auswählen

import threading

class MyThread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        
        self.stopped = threading.Event()
    
    def run(self):
        while not self.stopped.isSet():
            #Hier irgend etwas machen
            ....
    
    def stop(self):
        #Anhalten ausloesen
        self.stopped.set()

Verfasst: Mittwoch 11. April 2007, 09:48
von BlackJack
Wobei das `Event`-Objekt ein wenig overkill ist, wenn man dessen `wait()`-Methode nicht benötigt.

Verfasst: Mittwoch 11. April 2007, 10:18
von EyDu
BlackJack hat geschrieben:Wobei das `Event`-Objekt ein wenig overkill ist, wenn man dessen `wait()`-Methode nicht benötigt.
Das ist wohl wahr, aber spätestens wenn man etwas mit dem Thread machen möchte, verwendet man eine Message-Queue in Kombination mit einem Stop-Flag und dann auf ein Ereignis wartet (blockierend).

Verfasst: Donnerstag 12. April 2007, 15:05
von mitsuhiko
man kann threads schon killen. allerdings nur via ctypes

Verfasst: Donnerstag 12. April 2007, 19:40
von Leonidas
blackbird hat geschrieben:man kann threads schon killen. allerdings nur via ctypes
Dunkle CPython-Magic ;)

Verfasst: Donnerstag 12. April 2007, 21:41
von mitsuhiko
Leonidas hat geschrieben:
blackbird hat geschrieben:man kann threads schon killen. allerdings nur via ctypes
Dunkle CPython-Magic ;)
Ich bin mir momentan nicht sicher wie dunkel die ist:

Code: Alles auswählen

from ctypes import pythonapi, py_object
from time import sleep
import threading


def kill_thread(thread):
    """
    Kill a thread.
    """
    for tid, tobj in threading._active.iteritems():
        if tobj is thread:
            break
    else:
        raise TypeError('thread %r not running' % thread)
    exception = py_object(KeyboardInterrupt)
    emit = pythonapi.PyThreadState_SetAsyncExc
    rv = emit(tid, exception)
    while rv > 1:
        emit(tid, None)
        sleep(0.1)
        rv = emit(tid, exception)


if __name__ == '__main__':
    class Foo(threading.Thread):
        def run(self):
            while True:
                print 'still running'
                sleep(1)

    thread = Foo()
    thread.start()
    sleep(3)
    kill_thread(thread)
    print 'requested stop'
Problem: Der Thread läuft trotzdem noch ziemlich lang weiter.