The following works for your situation, but breaks the multi tasking (since I re-initialize the thread list).
It needs more work, but can be used temporarily.
I also fixed PEP 8 Issues
will start and restart the timer threads yet - still thinking about this one and open for all suggestions
It needs more work, but can be used temporarily.
I also fixed PEP 8 Issues
# # Author: Larry McCaig (Larz60+) # No warranty, use at your own risk! # Modify if you wish # import threading class EventTimer: """ Creates overlaping threaded timed events Events can be set to trigger in days, hours, minutes, and/or seconds Any number of events can be created, and are treated independently, thus can overlap each other. Program execution will continue until all events have completed. the function that is passed to each timer will execute after the timeout has been reached """ def __init__(self): self.threadList = [] def add_event(self, func, days=0, hours=0, minutes=0, seconds=0, new=False): if new: self.threadList = [] times = [days, hours, minutes, seconds] multiplier = [86400, 3600, 60, 1] count = 0 for n in range(len(times)): count += times[n] * multiplier[n] t = threading.Timer(count, func) self.threadList.append(t) def start_all(self): # Start threads [th.start() for th in self.threadList] def wait_for_finish(self): # wait for all to finish [th.join() for th in self.threadList] class MyTimedEvent(EventTimer): def __init__(self, max_iters=1, seconds=0): super().__init__() self.num_iterations_so_far = 0 self.max_iters = max_iters self.seconds = seconds def kick_off_event(self): self.add_event(self.event_triggered, seconds=self.seconds, new=True) self.start_all() def event_triggered(self): self.max_iters -= 1 print('T minus {}'.format(self.max_iters)) if self.max_iters: self.kick_off_event() def launch(): mte = MyTimedEvent(max_iters=8, seconds=2) mte.kick_off_event() mte.wait_for_finish() if __name__ == '__main__': launch()The following is my initial attempt at a new timer class that allows for recurring tasks - I haven't implemented the code that
will start and restart the timer threads yet - still thinking about this one and open for all suggestions
# # Author: Larry McCaig (Larz60+) # No warranty, use at your own risk! # Modify if you wish # import threading class EventTimer: """ Creates overlapping threaded timed events Events can be set to trigger in days, hours, minutes, and/or seconds Any number of events can be created, and are treated independently, thus can overlap each other. Program execution will continue until all events have completed. the function that is passed to each timer will execute after the timeout has been reached """ def __init__(self): self.threadList = [] def add_event(self, func, days=0, hours=0, minutes=0, seconds=0, recurring=False, max_iters=1): times = [days, hours, minutes, seconds] multiplier = [86400, 3600, 60, 1] count = 0 for n in range(len(times)): count += times[n] * multiplier[n] t = threading.Timer(count, func) self.threadList.append((t, recurring, max_iters)) def start_all(self): # Start threads [th.start() for th in self.threadList] def wait_for_finish(self): # wait for all to finish [th.join() for th in self.threadList] def show_threadlist(self) -> object: n = 0 for t, recurring, max_iters in self.threadList: print('Index: {}, thread: {}, recurring: {} max_iters: {}'.format( n, t, recurring, max_iters)) n += 1 return None def function1(): print('Function 1 triggered') def function2(): print('Function 2 triggered') def function3(): print('Function 3 triggered') def launch(): e = EventTimer() e.add_event(function1, seconds=5) e.add_event(function2, seconds=10) e.add_event(function3, seconds=2, recurring=True, max_iters=5) e.show_threadlist() if __name__ == '__main__': launch()