Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

timers not canceling!

132 views
Skip to first unread message

Alex Hall

unread,
Mar 24, 2010, 5:12:45 PM3/24/10
to python-list
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
>>>

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. I
am not looking for a reset, since I do not want it counting always.
Thanks.
--
Have a great day,
Alex (msg sent from GMail website)
meh...@gmail.com; http://www.facebook.com/mehgcap

Steve Holden

unread,
Mar 24, 2010, 5:36:20 PM3/24/10
to Alex Hall, python-list

I believe you'll need to create a new Timer each time you need one - a
Timer is a threading.thread, and these can only be started once.

"thread already started" implies that the thread is running, but you
actually get the same message if you try to start any terminated thread
(including a canceled one), so "threads cannot be restarted" might be a
better message.

regards
Steve
--
Steve Holden +1 571 484 6266 +1 800 494 3119
See PyCon Talks from Atlanta 2010 http://pycon.blip.tv/
Holden Web LLC http://www.holdenweb.com/
UPCOMING EVENTS: http://holdenweb.eventbrite.com/

Steve Holden

unread,
Mar 24, 2010, 5:36:20 PM3/24/10
to pytho...@python.org, python-list

Steven D'Aprano

unread,
Mar 24, 2010, 5:38:08 PM3/24/10
to
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

Steve Holden

unread,
Mar 24, 2010, 8:26:20 PM3/24/10
to python-list
Steve Holden wrote:
> Alex Hall wrote:
[...]

> "thread already started" implies that the thread is running, but you
> actually get the same message if you try to start any terminated thread
> (including a canceled one), so "threads cannot be restarted" might be a
> better message.
>
Or, better still, "Threads can only be started once".

Steve Holden

unread,
Mar 24, 2010, 8:26:20 PM3/24/10
to pytho...@python.org, python-list
0 new messages