| Store | Cart

Re: [Python-ideas] Adding threading.RepeatTimer class

From: Brian Curtin <bria...@gmail.com>
Thu, 27 Jan 2011 16:12:44 -0600
On Thu, Jan 27, 2011 at 12:03, Daniel da Silva <ddas...@umd.edu> wrote:

> We have a threading.Timer class which executes after a given delay and then> terminates. I was thinking about a pre-made class that would execute, wait> an interval, and then repeat. It would cut down on the logic people need to> implement themselves, and make simple scripts faster.>> Here are some use cases:>> # Send a ping message to all connected clients every 120 seconds> from server import ping_all_clients> pinger = threading.RepeatTimer(120, ping_all_clients)> pinger.start()>> # Check for updates every 3 hours> from mymodule import check_for_updates> update_checker = threading.RepeatTimer(60*60*3, check_for_updates)> update_checker.start()>>> I was thinking of the class having an initializer signature as follows:>> class threading.RepeatTimer(interval, function, args=[], kwargs={},> limit=None)>      Create a timer that will run function with args and kwargs and repeat> every interval secods. If limit is>      an integer, limits repetitions to that many calls.>>      cancel()>          Stop the repeat timer. If in the middle of a call, the call is> allowed to finish.>> Daniel


I'm not sure this is a good fit in the standard library. There's too much
that the implementer might want to customize for their repeating needs. For
your pinger, what if a ping fails? Keep pinging while it fails? Timeout for
a bit and try again? Increasing timeouts? Just exit? I don't think there's a
general enough use case that a repetitive timer has in order to be included.

The following will likely do what you want.

import threading

class RepeatTimer(threading.Thread):
    def __init__(self, interval, callable, *args, **kwargs):
        threading.Thread.__init__(self)
        self.interval = interval
        self.callable = callable
        self.args = args
        self.kwargs = kwargs
        self.event = threading.Event()
        self.event.set()

    def run(self):
        while self.event.is_set():
            t = threading.Timer(self.interval, self.callable,
                                self.args, self.kwargs)
            t.start()
            t.join()

    def cancel(self):
        self.event.clear()

_______________________________________________
Python-ideas mailing list
Pyth...@python.org
http://mail.python.org/mailman/listinfo/python-ideas

Recent Messages in this Thread
Daniel da Silva Jan 27, 2011 06:03 pm
Brian Curtin Jan 27, 2011 10:12 pm
Christian Heimes Jan 28, 2011 08:38 pm
Alex Grönholm Jan 27, 2011 10:37 pm
Messages in this thread