import sched import time def function_scheduler(exec_func, *args, interval: float = 1, timeout: float = 1) -> bool: """ Execute function or lambda with timeout and interval. Args: exec_func (function) - Function for execution. *args - Arguments for executing function. interval (float) - Function call interval. timeout (float) - Timeout until the end of calls function. Returns: function_successful (bool) - function result """ __sched = sched.scheduler() def __function_wrapper(): nonlocal function_successful nonlocal time_start if time.time() - time_start > timeout: function_successful = False for job in __sched.queue: __sched.cancel(job) return if function_successful or exec_func(*args): function_successful = True for job in __sched.queue: __sched.cancel(job) function_successful = False call_count = round(timeout / interval) for call in range(0, call_count): __sched.enter(call * interval, 1, __function_wrapper) time_start = time.time() __sched.run() return function_successful