My goal is to execute a function on a periodic time interval but with a high period.
The code linked below seemed very promising:
https://medium.com/greedygame-engineering/an-elegant-way-to-run-periodic-tasks-in-python-61b7c477b679.
With some minor modification i ended up with this:
import threading
import time
from datetime import timedelta
from unittest.mock import Mock
WAIT_TIME_SECONDS = 0.1
class PeriodicTask(threading.Thread):
""" Class for executing a periodic task specifying a time interval between invokations """
def __init__(self, interval: timedelta, execute: Callable[..., None], *args, **kwargs):
super().__init__()
assert isinstance(interval, timedelta), "Must specifiy datetime time interval, here"
assert not execute is None, "Must specify function which should be invoked regularly, here"
self.daemon = False
self.stopped = threading.Event()
self.interval = interval
self.execute = execute
self.args = args
self.kwargs = kwargs
def stop(self):
""" Stop periodic task """
self.stopped.set()
self.join()
def run(self):
""" Run task based on the specified interval """
while not self.stopped.wait(self.interval.total_seconds()):
self.execute(*self.args, **self.kwargs)
if __name__ == "__main__":
foo = Mock()
job = PeriodicTask(interval=timedelta(seconds=WAIT_TIME_SECONDS), execute=foo)
job.start()
time.sleep(1)
job.stop()
It seems i can execute periodic tasks down to a period of approx 100ms (Intel Core i7-3770K CPU, 3.5 GHz, 16 GB RAM), before tasks hinder each other. Is there a way to optimize this code fragment so i can execute tasks periodically down to at least 10ms?