Source code for pyquickhelper.loghelper.time_helper

"""
Helpers around time.


:githublink:`%|py|5`
"""
import os
import time
from .run_cmd import run_script


[docs]def repeat_execution(fct, every_second=1, stop_after_second=5, verbose=0, fLOG=None, exc=True): """ Runs a function on a regular basis. The function is not multithreaded, it returns when all execution are done. :param fct: function to run :param every_second: every second :param stop_after_second: stop after a given time or never if None :param verbose: prints out every execution :param fLOG: logging function :param exc: if False, catch exception, else does not catch them :return: results of the function if *stop_after_second* is not None :githublink:`%|py|26` """ iter = 0 start = time.monotonic() end = None if stop_after_second is None else start + stop_after_second current = start res = [] while end is None or current < end: iter += 1 if exc: r = fct() if verbose > 0 and fLOG is not None: fLOG("[repeat_execution] iter={} time={} end={}".format( iter, current, end)) if stop_after_second is not None: res.append(r) else: try: r = fct() if verbose > 0 and fLOG is not None: fLOG("[repeat_execution] iter={} time={} end={}".format( iter, current, end)) if stop_after_second is not None: res.append(r) except Exception as e: if verbose > 0 and fLOG is not None: fLOG("[repeat_execution] iter={} time={} end={} error={}".format( iter, current, end, str(e))) while current <= time.monotonic(): current += every_second while time.monotonic() < current: time.sleep(every_second / 2) return res if res else None
[docs]def repeat_script_execution(script, every_second=1, stop_after_second=5, outfile=None, errfile=None, verbose=0, fLOG=None, exc=True): """ Runs a python script on a regular basis. The function is not multithreaded, it returns when all execution are done. :param script: script to run :param every_second: every second :param stop_after_second: stop after a given time or never if None :param outfile: file which receives the standard output :param errfile: file which receives the standard error :param verbose: prints out every execution :param fLOG: logging function :param exc: if False, catch exception, else does not catch them :return: all outputs if *stop_after_second* is not None :githublink:`%|py|80` """ if not os.path.exists(script): raise FileNotFoundError("Unable to find '{}'.".format(script)) iter = [0] def fct_(): out, err = run_script(script, wait=True) if out and outfile: with open(outfile, "a", encoding="utf-8") as f: f.write('[repeat_script_execution] iter={}\n'.format(iter[0])) f.write(out) if err and errfile: with open(errfile, "a", encoding="utf-8") as f: f.write('[repeat_script_execution] iter={}\n'.format(iter[0])) f.write(err) iter[0] += 1 return out return repeat_execution(fct_, every_second=every_second, stop_after_second=stop_after_second, verbose=verbose, fLOG=fLOG, exc=exc)