Timing is easy using a thread and `time.sleep`. The second example encapsulates all that is required into a class. The third shows how to make things interruptible. ## timed_event.py ```py from time import sleep from threading import Thread def task(): sleep(10) print("something") Thread(target=task).start() for i in range(20): print("Waiting",i) sleep(1) print("done") ``` ## timed_event2.py ```py from time import sleep from threading import Thread import time class Timed: def __init__(self,target,delay,*args): self.thread = Thread(target=self.task) self.target = target self.args = args self.delay = float(delay) def task(self): time.sleep(self.delay) self.target(*self.args) def start(self): self.thread.start() def join(self): return self.thread.join() def task(): print("something") Timed(task,5).start() for i in range(10): print("Waiting",i) sleep(1) print("done") ``` ## timed_event3.py We test the `shouldquit` variable once per second. We allow for fractional delay time by decrementing the delay time by one second each time and having a special case to handle a fraction left over. That is, for a delay of 2.5 seconds, we `sleep(1)` twice so that the remaining time is 0.5 seconds, and then `sleep(0.5)` for the final bit of the delay. ```py from time import sleep from threading import Thread import time class Timed: def __init__(self,target,delay,*args): self.thread = Thread(target=self.task) self.target = target self.args = args self.delay = float(delay) self.shouldquit = False def quit(self): self.shouldquit = True return self def task(self): while self.delay > 0: if self.shouldquit: print("Interrupted") return if self.delay < 1: time.sleep(self.delay) break else: self.delay -= 1 time.sleep(1) self.target(*self.args) def start(self): self.thread.start() return self def join(self): return self.thread.join() def task(): print("something") victim.quit() def task2(): print("should not print") Timed(task,2.5).start() victim = Timed(task2,5).start() for i in range(10): print("Waiting",i) sleep(1) print("done") ```