class RulesService(MessagingEnabled, BasePlugin): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.exited = Event() def on_service_start(self, *args, **kwargs): self.notify_start() self.exited.wait() def on_service_stop(self, *args, **kwargs): self.exited.stop()
def after(delay, action, *args): """ Execute an action after a given number of seconds. This function is executed in a separate thread. Parameters ---------- delay : float Number of seconds to delay the action. action To be taken after the interval. args : tuple, default is () Arguments for the action. Returns ------- Event A timer object that can be terminated using the `stop()` method. """ event = Event() def wait(): if event.wait(delay): return action(*args) Thread(target=wait).start() event.stop = event.set return event
def repeat(interval, action, *args): """ Repeat an action forever after a given number of seconds. If a sequence of events takes longer to run than the time available before the next event, the repeater will simply fall behind. This function is executed in a separate thread. Parameters ---------- interval : float Number of seconds between executions. action To be taken after the interval. args : tuple, default is () Arguments for the action. Returns ------- Event A timer object that can be terminated using the `stop()` method. """ event = Event() def loop(): starttime = time.time() while True: nexttime = starttime + interval action(*args) after_action = time.time() if event.wait(nexttime - after_action): break starttime = max(after_action, nexttime) Thread(target=loop).start() event.stop = event.set return event