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

How to run a repeating timer every n minutes?

3,025 views
Skip to first unread message

VYAS ASHISH M-NTB837

unread,
Oct 29, 2009, 7:05:46 AM10/29/09
to pytho...@python.org

Dear All

How do I write a code that gets executed 'every x' minutes?

I know how to do it 'after x' minutes, I do the following:

def doAtTimerFire():
""" The things I want to do 'after x' minutes go here. """

And then from main code, I do this:

tmr = threading.Timer(timeInSeconds, doAtTimerFire)
tmr.start()


Sorry about the earlier post with wrong subject line.
Please help.

Regards,
Ashish Vyas

Martin P. Hellwig

unread,
Oct 29, 2009, 7:33:15 AM10/29/09
to
VYAS ASHISH M-NTB837 wrote:
<cut>
You might want to start a thread with a continues loop that primarily
sleeps (time.sleep) but wakes up at regular intervals and executes what
needs to be.

--
MPH
http://blog.dcuktec.com
'If consumed, best digested with added seasoning to own preference.'

Frank Millman

unread,
Oct 29, 2009, 7:48:43 AM10/29/09
to pytho...@python.org
Ashish Vyas wrote:

> Dear All
>
> How do I write a code that gets executed 'every x' minutes?
>

[...]

> Regards,
> Ashish Vyas

Here is one way -

import threading

class Timer(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.event = threading.Event()

def run(self):
while not self.event.is_set():
""" The things I want to do go here. """
self.event.wait(number_of_seconds_to_wait)

def stop(self):
self.event.set()

In your main program -
- to start the timer
tmr = Timer()
tmr.start()

- to stop the timer
tmr.stop()

It is easy to extend this by passing the number_of_seconds_to_wait, or a
function name to be executed, as arguments to the Timer.

Frank Millman

VYAS ASHISH M-NTB837

unread,
Oct 29, 2009, 9:03:13 AM10/29/09
to Frank Millman, pytho...@python.org

Thanks a lot, this helps.

Ashish Vyas wrote:

[...]

> Regards,
> Ashish Vyas

import threading

def stop(self):
self.event.set()

Frank Millman

--
http://mail.python.org/mailman/listinfo/python-list

mk

unread,
Oct 29, 2009, 12:03:00 PM10/29/09
to pytho...@python.org
Frank Millman wrote:

> class Timer(threading.Thread):
> def __init__(self):
> threading.Thread.__init__(self)
> self.event = threading.Event()
>
> def run(self):
> while not self.event.is_set():
> """ The things I want to do go here. """
> self.event.wait(number_of_seconds_to_wait)
>
> def stop(self):
> self.event.set()
>
> In your main program -
> - to start the timer
> tmr = Timer()
> tmr.start()
>
> - to stop the timer
> tmr.stop()
>
> It is easy to extend this by passing the number_of_seconds_to_wait, or a
> function name to be executed, as arguments to the Timer.

I'm newbie at threading, so I'm actually asking: should not method like
stop() be surrounded with acquire() and release() of some threading.lock?

I mean, is this safe to update running thread's data from the main
thread without lock?

Regards,
mk


Diez B. Roggisch

unread,
Oct 29, 2009, 12:15:31 PM10/29/09
to
mk wrote:

stop() is part of the Timer-interface, and tas it's not mentioned to be
unsafe in the docs you can just call it. It might be that it internally
calls some threadsafe means of communication (Event, Lock).

In general you are right, however many of those considerations don't apply
to (C)Python due to the GIL (global interpreter lock), which ensures that a
lot of operations are atomic. For example, in current CPython it's
perfectly safe to simply set a boolean instance variable to False to stop
an running loop.

Diez

Frank Millman

unread,
Oct 30, 2009, 3:14:41 AM10/30/09
to pytho...@python.org
Diez B. Roggisch wrote:

> mk wrote:
>
>>
>> I'm newbie at threading, so I'm actually asking: should not method like
>> stop() be surrounded with acquire() and release() of some threading.lock?
>>
>> I mean, is this safe to update running thread's data from the main
>> thread without lock?
>
> stop() is part of the Timer-interface, and tas it's not mentioned to be
> unsafe in the docs you can just call it. It might be that it internally
> calls some threadsafe means of communication (Event, Lock).
>

Thought I should jump in here to avoid any confusion.

mk is referring to the Timer class that I included in my reply to the OP. It
is different from the Timer class in the threading module. I had not
realised that I was duplicating an existing name - sorry about that.

The standard Timer class has a method called cancel(). I am sure that Diez's
comments above will apply to this.

I included a method called stop() in my Timer class, and I think it is to
this that mk is referring.

The method looks like this -

def stop(self):
self.event.set()

Is this threadsafe? I would have thought the answer is yes, but I am no
expert. Perhaps someone else can confirm.

Thanks

Frank Millman

0 new messages