예제 #1
0
    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))
예제 #2
0
    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()
예제 #3
0
    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))
예제 #4
0
    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))
예제 #5
0
    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))
예제 #6
0
 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()
예제 #7
0
 def calc_next(self):
     self.start_mono = monotonic()
     return self.start_mono - (self.start_mono % self.update_every
                               ) + self.update_every + self.penalty
예제 #8
0
 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()
예제 #9
0
 def calc_next(self):
     self.start_mono = monotonic()
     return self.start_mono - (self.start_mono % self.update_every) + self.update_every + self.penalty