Thread zerstoeren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Costi
User
Beiträge: 545
Registriert: Donnerstag 17. August 2006, 14:21

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
cp != mv
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.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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()
BlackJack

Wobei das `Event`-Objekt ein wenig overkill ist, wenn man dessen `wait()`-Methode nicht benötigt.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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).
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

man kann threads schon killen. allerdings nur via ctypes
TUFKAB – the user formerly known as blackbird
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

blackbird hat geschrieben:man kann threads schon killen. allerdings nur via ctypes
Dunkle CPython-Magic ;)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

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.
TUFKAB – the user formerly known as blackbird
Antworten