[Python-ideas] Adding threading.RepeatTimer class
Brian Curtin
brian.curtin at gmail.com
Thu Jan 27 23:12:44 CET 2011
More information about the Python-ideas mailing list
Thu Jan 27 23:12:44 CET 2011
- Previous message: [Python-ideas] Adding threading.RepeatTimer class
- Next message: [Python-ideas] Adding threading.RepeatTimer class
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
On Thu, Jan 27, 2011 at 12:03, Daniel da Silva <ddasilva at 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() -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://mail.python.org/pipermail/python-ideas/attachments/20110127/c70bcec3/attachment.html>
- Previous message: [Python-ideas] Adding threading.RepeatTimer class
- Next message: [Python-ideas] Adding threading.RepeatTimer class
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Python-ideas mailing list