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: 544
Registriert: Donnerstag 17. August 2006, 14:21

Dienstag 10. April 2007, 20:33

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

Dienstag 10. April 2007, 21:16

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: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Mittwoch 11. April 2007, 08:25

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

Mittwoch 11. April 2007, 09:48

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

Mittwoch 11. April 2007, 10:18

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:

Donnerstag 12. April 2007, 15:05

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

Donnerstag 12. April 2007, 19:40

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

Donnerstag 12. April 2007, 21:41

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