    async def run_cycle(self):
        """Run one round of tasks.

        Each task is inspected and in case their starting condition
        is fulfilled, they are run.  A task can be running once at
        any given time (in other words, multiple paraller execution
        of a single task is not supported at the moment). Tasks that
        are running but their termination condition is fulfilled are
        terminated.
        """
        tasks = self.tasks
        self.logger.debug(f"Beginning cycle with {len(tasks)} tasks...", extra={"action": "run"})

        # Running hooks
        hooker = _Hooker(self.session.hooks.scheduler_cycle)
        hooker.prerun(scheduler=self)

        for task in tasks:
            with task.lock:
                self.handle_logs()
                task._clean_run_stack()
                if task.on_startup or task.on_shutdown:
                    # Startup or shutdown tasks are not run in main sequence
                    pass
                elif self._flag_enabled.is_set() and self.is_task_runnable(task):
                    # Run the actual task
                    await self.run_task(task)
                    # Reset force_run as a run has forced
                    task.force_run = False
                await task._check_termination()
        self.handle_logs()
        self.check_thread_errors()
        # Running hooks
        hooker.postrun()

        self.n_cycles += 1
Run one round of tasks.

Each task is inspected and in case their starting condition
is fulfilled, they are run.  A task can be running once at
any given time (in other words, multiple paraller execution
of a single task is not supported at the moment). Tasks that
are running but their termination condition is fulfilled are
terminated.
rocketry/core/schedule.py