Skip to content

Instantly share code, notes, and snippets.

@aug2uag
Forked from bbengfort/interval.py
Created November 14, 2020 07:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aug2uag/6e0b530aaf44bb2bfba501ebded33e8a to your computer and use it in GitHub Desktop.
Save aug2uag/6e0b530aaf44bb2bfba501ebded33e8a to your computer and use it in GitHub Desktop.
Run a function every n seconds using Python threading.
from threading import Timer
from functools import partial
class Interval(object):
def __init__(self, interval, function, args=[], kwargs={}):
"""
Runs the function at a specified interval with given arguments.
"""
self.interval = interval
self.function = partial(function, *args, **kwargs)
self.running = False
self._timer = None
def __call__(self):
"""
Handler function for calling the partial and continuting.
"""
self.running = False # mark not running
self.start() # reset the timer for the next go
self.function() # call the partial function
def start(self):
"""
Starts the interval and lets it run.
"""
if self.running:
# Don't start if we're running!
return
# Create the timer object, start and set state.
self._timer = Timer(self.interval, self)
self._timer.start()
self.running = True
def stop(self):
"""
Cancel the interval (no more function calls).
"""
if self._timer:
self._timer.cancel()
self.running = False
self._timer = None
if __name__ == "__main__":
import time
import random
def clock(start):
"""
Prints out the elapsed time when called from start.
"""
print "elapsed: {:0.3f} seconds".format(
time.time() - start
)
# Create an interval.
interval = Interval(random.randint(1,3), clock, args=[time.time(),])
print "Starting Interval, press CTRL+C to stop."
interval.start()
while True:
try:
time.sleep(0.1)
except KeyboardInterrupt:
print "Shutting down interval ..."
interval.stop()
break
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment