timers not canceling!

Steven D'Aprano steven at REMOVE.THIS.cybersource.com.au
Wed Mar 24 17:38:08 EDT 2010


On Wed, 24 Mar 2010 17:12:45 -0400, Alex Hall wrote:

> Hi all,
> I am having trouble with a timer I am trying to use. It is the same
> timer, but I need to cancel it when a certain event happens, then start
> it again when a second event happens. The below is from a shell session,
> not a file, but it shows my problem: I call cancel on a timer, then call
> start on it, and it thinks it is already running? What am I missing?
> 
>>>> from threading import Timer
>>>> def func():
> ...  print("Time up!")
> ...
>>>> t=Timer(10.0, func)
>>>> t.start()
>>>> t.cancel()
>>>> t.start()
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
>   File "C:\python26\lib\threading.py", line 465, in start
>     raise RuntimeError("thread already started")
> RuntimeError: thread already started


The start method is to start generic threads, not just timers, and 
threads don't support being restarted.

Timers are fairly simple objects: after you start the thread, they just 
wait until the time expires, then run a function. You can cancel them, 
but not pause and restart them.

To do what you are trying to do, you will need to subclass either Timer 
or thread and implement your own logic for pausing or restarting the 
count down.


> I typed start, then typed cancel within ten seconds (probably four or
> five), then called start again a couple seconds later. I figured
> canceling the timer would kill the thread so I could start it again.


That's not how they work. "start" means "start the thread", not "start 
the timer", and threads cannot be restarted.

The documentation is very clear:

"start()
Start the thread’s activity.

It must be called at most once per thread object. It arranges for the 
object’s run() method to be invoked in a separate thread of control."

http://docs.python.org/library/threading.html#thread-objects


-- 
Steven



More information about the Python-list mailing list