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
Thread zerstoeren
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.
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()
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).BlackJack hat geschrieben:Wobei das `Event`-Objekt ein wenig overkill ist, wenn man dessen `wait()`-Methode nicht benötigt.
-
- User
- Beiträge: 1790
- Registriert: Donnerstag 28. Oktober 2004, 16:33
- Wohnort: Graz, Steiermark - Österreich
- Kontaktdaten:
Ich bin mir momentan nicht sicher wie dunkel die ist:Leonidas hat geschrieben:Dunkle CPython-Magicblackbird hat geschrieben:man kann threads schon killen. allerdings nur via ctypes
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'
TUFKAB – the user formerly known as blackbird