Files
cpu_governor_auto_adjust/schedule.py
T
2024-12-17 20:48:00 +01:00

51 lines
2.0 KiB
Python

from app_class import AppClass
from config import Config
from trigger import Trigger
import asyncio
from asyncio import Task
class TriggerScheduler(AppClass):
def __init__(self, _config: Config) -> None:
super().__init__(_config)
self.tasks: list[Task] = []
async def callback_trigger(self, _trigger: Trigger) -> None:
"""Run a callback_trigger with a specific name and check its status at a given interval."""
await _trigger.async_run()
while True:
trigger_state = "active" if _trigger.active else "not active"
self.log.debug("Checking state of trigger %s, state: %s", _trigger.name, trigger_state)
await asyncio.sleep(_trigger.config.interval_in_seconds)
async def run_once_trigger(self, _trigger: Trigger) -> None:
"""Run a trigger with a specific name at a given interval."""
while True:
_trigger.run()
trigger_state = "active" if _trigger.active else "not active"
self.log.debug("Checking state of trigger %s, state: %s", _trigger.name, trigger_state)
await asyncio.sleep(_trigger.config.interval_in_seconds)
def start_trigger(self, _trigger: Trigger) -> None:
"""Start a new trigger."""
if _trigger.config.type == "callback":
task = asyncio.create_task(self.callback_trigger(_trigger))
else:
task = asyncio.create_task(self.run_once_trigger(_trigger))
self.tasks.append(task)
async def stop_triggers(self) -> None:
"""Stop all triggers."""
for task in self.tasks:
task.cancel()
await asyncio.gather(*self.tasks, return_exceptions=True)
async def run(self) -> None:
"""Run the scheduler and keep it alive until stopped."""
try:
while True:
await asyncio.sleep(1) # Keep the main function alive
except asyncio.exceptions.CancelledError:
self.log.info("Exiting, stopping all triggers")
await self.stop_triggers()