Wie zu töten das threading.Timer?
Habe ich ins Leben gerufen ein thread mit einem Timer
Objekt. Jetzt will ich halt diesen thread, aber ich kann nicht. Ich habe verwendet cancel()
, aber es funktioniert nicht. Ich weiß nicht, warum.
import threading
import time
import sys as system
def Nop():
print("do nothing")
return 0
def function():
try:
while True:
print("hello world ")
time.sleep(2)
except KeyboardInterrupt:
print( "Good job!! exception catched")
t = threading.Timer(10, function)
t.start()
print(t.getName)
counter = 0
while True:
try:
time.sleep(1)
Nop()
counter = counter +1
print(counter)
if counter == 20:
print(t.getName)
t.cancel()
counter = 0
break
if t.is_alive() == False:
print("The Timer thread is dead...")
except KeyboardInterrupt:
print("End of program")
t.cancel()
system.exit(0)
except:
print("something wrong happens...")
if t.is_alive() == True:
print("timer is alive...")
print(t.getName)
t.cancel()
print("final")
system.exit(0)
Den thread sollte stoppen, wenn Zähler wird gleich 20, aber es ist immer noch lebendig. Wenn ich aus der while-Schleife, es ist eine weitere Prüfung. Der Timer ist lebendig, ist der gleiche thread, ich versuche zu kündigen, aber es funktioniert nicht.
Irgendeine Idee?
do nothing
17
hello world
do nothing
18
do nothing
19
hello world do nothing
20
<bound method _Timer.getName of <_Timer(Thread-6, started daemon 9916)>>
timer is alive...
<bound method _Timer.getName of <_Timer(Thread-6, started daemon 9916)>>
final
To exit: use 'exit', 'quit', or Ctrl-D.
An exception has occurred, use %tb to see the full traceback.
SystemExit: 0
hello world
hello world
hello world
hello world
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem hier gelöst werden kann, durch das Lesen die Dokumentation mehr gezielt. Ein timer-thread
cancel
- Methode "... funktioniert nur, wenn der timer noch in der warte-Phase."Durch die Zeit, die Sie rufen
t.cancel
den timer ausgelöst hat, und die zugehörige Funktion ausgeführt wird, so ist es nicht mehr "in der warte-Phase", obwohl die Funktion eigentlich verbringt die meiste Zeit mit schlafen - dies bedeutet NICHT, dass es in seinem warte-Phase, die beendet wird, wenn der timer feuert..Generell gibt es keinen Weg, um zu töten ein thread ohne deren aktive Mitarbeit, als mehrere SO Antworten schon gut zusammenfassen.
Anstatt
cancel
sollten Sie irgendeine Art von fahne, diefunction
schaut, um festzustellen, ob es sollte zu kündigen, seine-Schleife (und damit der ganze thread) oder nicht.Versuchen:
Ich diese nicht funktionieren wird oder nicht, aber die
cancel
Methode sollte verwendet werden, auf der Bühne warten. Finden Sie in der Dokumentation für weitere Hilfe. Sie versuchen, verwenden Sie den Vorgang Abbrechen möchten, nachdem es wartet Bühne.Wenn die
del
- Anweisung nicht funktioniert, versuchen Sie dies:Hoffentlich etwas hilft.