2019-03-27 20:52:05 +00:00
|
|
|
from time import monotonic, sleep
|
2019-05-01 00:34:26 +00:00
|
|
|
from threading import Event, Thread
|
2019-03-27 20:52:05 +00:00
|
|
|
|
|
|
|
class Every:
|
|
|
|
def __init__(self, interval, function, *args, **kwargs):
|
|
|
|
self.interval = interval
|
|
|
|
self.function = function
|
2019-05-03 21:26:58 +00:00
|
|
|
self.args = args
|
|
|
|
self.kwargs = kwargs
|
2019-05-01 00:34:26 +00:00
|
|
|
self.event = Event()
|
2019-03-27 20:52:05 +00:00
|
|
|
|
2019-05-01 00:34:26 +00:00
|
|
|
def _wrapper(self, *args, **kwargs):
|
2019-03-27 20:52:05 +00:00
|
|
|
start = monotonic()
|
2019-05-07 05:00:20 +00:00
|
|
|
state = None
|
2019-05-01 00:34:26 +00:00
|
|
|
while not self.event.is_set():
|
2019-05-07 05:00:20 +00:00
|
|
|
state = self.function(state, *args, **kwargs)
|
2019-03-27 20:52:05 +00:00
|
|
|
sleep(self.interval - ((monotonic() - start) % self.interval))
|
|
|
|
|
|
|
|
def start(self):
|
2019-05-03 21:26:58 +00:00
|
|
|
args = self.args
|
|
|
|
kwargs = self.kwargs
|
2019-05-01 00:34:26 +00:00
|
|
|
thread = Thread(target=self._wrapper, args=args, kwargs=kwargs)
|
|
|
|
thread.setDaemon(True)
|
|
|
|
thread.start()
|
2019-05-07 05:00:20 +00:00
|
|
|
return thread
|
2019-03-27 20:52:05 +00:00
|
|
|
|
|
|
|
def stop(self):
|
2019-05-01 00:34:26 +00:00
|
|
|
self.event.set()
|