How to kill this threading.Timer?

11,131

The problem here can be solved by reading the documentation more carefully. A timer thread's cancel method "... will only work if the timer is still in its waiting stage."

By the time you call t.cancel the timer has fired, and its associated function is executing so it is no longer "in its waiting stage", even though the function actually spends most of its time sleeping - this does NOT mean it's in its waiting stage, which terminates when the timer fires..

More generally there is no way to kill a thread without its active cooperation, as several SO answers already summarize well.

Rather than using cancel you should set some sort of flag that function looks at to determine whether it should terminate its loop (and therefore the whole thread) or not.

Share:
11,131
Admin
Author by

Admin

Updated on June 04, 2022

Comments

  • Admin
    Admin almost 2 years

    I have launched a thread using a Timer object. Now, I want to stop this thread but I can't. I have used cancel(), but it doesn't work. I don't know why.

    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)  
    

    The thread should stop when counter is equal to 20, but it is still alive. When I am out of the while loop, there is another check. The Timer is alive, is the same thread, I try to cancel, but it doesn't work.

    Any Idea?

    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