def run(self): """ Runs job in thread. Handles retries. Exits when job failed or timed out. :return: None """ job = self._runtime_counters self.debug('started, update frequency: {freq}, ' 'retries: {retries}'.format(freq=job.FREQ, retries=job.RETRIES_MAX - job.RETRIES)) while True: job.START_RUN = monotonic() job.NEXT_RUN = job.START_RUN - (job.START_RUN % job.FREQ) + job.FREQ + job.PENALTY self.sleep_until_next_run() if job.PREV_UPDATE: job.SINCE_UPDATE = int((job.START_RUN - job.PREV_UPDATE) * 1e6) try: updated = self.update(interval=job.SINCE_UPDATE) except Exception as error: self.error('update() unhandled exception: {error}'.format( error=error)) updated = False job.RUNS += 1 if not updated: if not self.manage_retries(): return else: job.ELAPSED = int((monotonic() - job.START_RUN) * 1e3) job.PREV_UPDATE = job.START_RUN job.RETRIES, job.PENALTY = 0, 0 safe_print( RUNTIME_CHART_UPDATE.format(job_name=self.name, since_last=job.SINCE_UPDATE, elapsed=job.ELAPSED)) self.debug('update => [{status}] (elapsed time: {elapsed}, ' 'retries left: {retries})'.format( status='OK' if updated else 'FAILED', elapsed=job.ELAPSED if updated else '-', retries=job.RETRIES_MAX - job.RETRIES))
def sleep_until_next_run(self): job = self._runtime_counters # sleep() is interruptable while job.is_sleep_time(): sleep_time = job.NEXT_RUN - job.START_RUN self.debug('sleeping for {sleep_time} to reach frequency of {freq} sec'.format(sleep_time=sleep_time, freq=job.FREQ + job.PENALTY)) sleep(sleep_time) job.START_RUN = monotonic()
def run(self): """ Runs job in thread. Handles retries. Exits when job failed or timed out. :return: None """ job = self._runtime_counters self.debug('started, update frequency: {freq}, ' 'retries: {retries}'.format(freq=job.FREQ, retries=job.RETRIES_MAX - job.RETRIES)) while True: job.START_RUN = monotonic() job.NEXT_RUN = job.START_RUN - (job.START_RUN % job.FREQ) + job.FREQ + job.PENALTY self.sleep_until_next_run() if job.PREV_UPDATE: job.SINCE_UPDATE = int((job.START_RUN - job.PREV_UPDATE) * 1e6) try: updated = self.update(interval=job.SINCE_UPDATE) except Exception as error: self.error('update() unhandled exception: {error}'.format(error=error)) updated = False job.RUNS += 1 if not updated: if not self.manage_retries(): return else: job.ELAPSED = int((monotonic() - job.START_RUN) * 1e3) job.PREV_UPDATE = job.START_RUN job.RETRIES, job.PENALTY = 0, 0 safe_print(RUNTIME_CHART_UPDATE.format(job_name=self.name, since_last=job.SINCE_UPDATE, elapsed=job.ELAPSED)) self.debug('update => [{status}] (elapsed time: {elapsed}, ' 'retries left: {retries})'.format(status='OK' if updated else 'FAILED', elapsed=job.ELAPSED if updated else '-', retries=job.RETRIES_MAX - job.RETRIES))
def run(self): """ Runs job in thread. Handles retries. Exits when job failed or timed out. :return: None """ job = self._runtime_counters self.debug( 'started, update frequency: {freq}, retries: {retries}'.format( freq=job.update_every, retries=job.max_retries - job.retries), ) while True: job.sleep_until_next() since = 0 if job.prev_update: since = int((job.start_real - job.prev_update) * 1e6) try: updated = self.update(interval=since) except Exception as error: self.error('update() unhandled exception: {error}'.format( error=error)) updated = False job.runs += 1 if not updated: if not job.handle_retries(): return else: job.elapsed = int((monotonic() - job.start_mono) * 1e3) job.prev_update = job.start_real job.retries, job.penalty = 0, 0 safe_print( RUNTIME_CHART_UPDATE.format(job_name=self.name, since_last=since, elapsed=job.elapsed)) self.debug('update => [{status}] (elapsed time: {elapsed}, ' 'retries left: {retries})'.format( status='OK' if updated else 'FAILED', elapsed=job.elapsed if updated else '-', retries=job.max_retries - job.retries))
def run(self): """ Runs job in thread. Handles retries. Exits when job failed or timed out. :return: None """ job = self._runtime_counters self.debug('started, update frequency: {freq}, retries: {retries}'.format( freq=job.update_every, retries=job.max_retries - job.retries), ) while True: job.sleep_until_next() since = 0 if job.prev_update: since = int((job.start_real - job.prev_update) * 1e6) try: updated = self.update(interval=since) except Exception as error: self.error('update() unhandled exception: {error}'.format(error=error)) updated = False job.runs += 1 if not updated: if not job.handle_retries(): return else: job.elapsed = int((monotonic() - job.start_mono) * 1e3) job.prev_update = job.start_real job.retries, job.penalty = 0, 0 safe_print(RUNTIME_CHART_UPDATE.format(job_name=self.name, since_last=since, elapsed=job.elapsed)) self.debug('update => [{status}] (elapsed time: {elapsed}, ' 'retries left: {retries})'.format(status='OK' if updated else 'FAILED', elapsed=job.elapsed if updated else '-', retries=job.max_retries - job.retries))
def sleep_until_next(self): next_time = self.calc_next() while self.start_mono < next_time: sleep(next_time - self.start_mono) self.start_mono = monotonic() self.start_real = time()
def calc_next(self): self.start_mono = monotonic() return self.start_mono - (self.start_mono % self.update_every ) + self.update_every + self.penalty
def sleep_until_next(self): next_time = self.calc_next() while self.start_mono < next_time: sleep(next_time - self.start_mono) self.start_mono = monotonic() self.start_real = time()
def calc_next(self): self.start_mono = monotonic() return self.start_mono - (self.start_mono % self.update_every) + self.update_every + self.penalty