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.
Costi
User
Beiträge: 544
Registriert: Donnerstag 17. August 2006, 14:21

Thread zerstoeren

Beitragvon Costi » 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

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

Beitragvon EyDu » 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

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

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

Beitragvon mitsuhiko » Donnerstag 12. April 2007, 15:05

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

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

Beitragvon mitsuhiko » 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

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]