made governor_control async

This commit is contained in:
2025-04-03 18:05:19 +02:00
parent 38381f60b5
commit 83d64453c0
4 changed files with 22 additions and 23 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8" ?>
<cpuGovernorAutoAdjust> <cpuGovernorAutoAdjust>
<logLevel>Info</logLevel> <logLevel>Debug</logLevel>
<testMode>true</testMode> <testMode>true</testMode>
<defaultGovernor>powersave</defaultGovernor> <defaultGovernor>powersave</defaultGovernor>
<statisticsIntervalInSeconds>5</statisticsIntervalInSeconds> <statisticsIntervalInSeconds>5</statisticsIntervalInSeconds>
+15 -5
View File
@@ -4,6 +4,7 @@ from cpufreq import cpuFreq, cpufreq # type: ignore
from functools import cached_property from functools import cached_property
from cpu_governor_auto_adjust.exceptions import GovernorNotFound from cpu_governor_auto_adjust.exceptions import GovernorNotFound
from typing import Optional, NamedTuple from typing import Optional, NamedTuple
import asyncio
class Governor(NamedTuple): class Governor(NamedTuple):
@@ -24,7 +25,8 @@ _governor_list: tuple[Governor, Governor, Governor, Governor, Governor, Governor
class GovernorControl(AppClass): class GovernorControl(AppClass):
def __init__(self, _config: Config) -> None: def __init__(self, _config: Config) -> None:
super().__init__(_config) super().__init__(_config)
self.log.info("current governor is: %s", self.current_governor) self.governor = self.current_governor
self.log.info("current governor is: %s", self.governor)
@cached_property @cached_property
def _cpufreq(self) -> Optional[cpuFreq]: def _cpufreq(self) -> Optional[cpuFreq]:
@@ -35,9 +37,9 @@ class GovernorControl(AppClass):
return None return None
@property @property
def current_governor(self) -> Optional[Governor]: def current_governor(self) -> Governor:
if self._cpufreq is None: if self._config.testmode:
return None return [g for g in _governor_list if g.name == "ondemand"].pop()
_governor = set(self._cpufreq.get_governors().values()) _governor = set(self._cpufreq.get_governors().values())
_governor_to_return = self._establish_governor(list(_governor)[0]) _governor_to_return = self._establish_governor(list(_governor)[0])
if len(_governor) == 0: if len(_governor) == 0:
@@ -57,7 +59,7 @@ class GovernorControl(AppClass):
raise RuntimeError("could not establish governor") raise RuntimeError("could not establish governor")
return governor return governor
def set_governor(self, governor_name: str) -> None: def _set_governor(self, governor_name: str) -> None:
self.log.info("setting cpu governor to %s", governor_name) self.log.info("setting cpu governor to %s", governor_name)
if self._config.testmode: if self._config.testmode:
@@ -72,3 +74,11 @@ class GovernorControl(AppClass):
return None return None
self._cpufreq.set_governors(governor_name) self._cpufreq.set_governors(governor_name)
async def run(self) -> None:
self.log.debug("running governor control")
while True:
if self.current_governor != self.governor:
self.log.debug("governor has changed from %s to %s", self.current_governor, self.governor)
self._set_governor(self.governor.name)
await asyncio.sleep(1)
+5 -16
View File
@@ -21,7 +21,7 @@ class TriggerScheduler(AppClass):
def governor_control(self) -> GovernorControl: def governor_control(self) -> GovernorControl:
return GovernorControl(self._config) return GovernorControl(self._config)
def establish_preferred_governor(self) -> str: def establish_preferred_governor(self) -> Governor:
self.log.debug('establishing preferred governor, default governor: %s', self._config.default_governor) self.log.debug('establishing preferred governor, default governor: %s', self._config.default_governor)
preferred_governor: Governor = [gov for gov in _governor_list if gov.name == self._config.default_governor].pop() preferred_governor: Governor = [gov for gov in _governor_list if gov.name == self._config.default_governor].pop()
for trigger in self.running_triggers: for trigger in self.running_triggers:
@@ -29,19 +29,8 @@ class TriggerScheduler(AppClass):
if trigger._active: if trigger._active:
if trigger.governor.priority < preferred_governor.priority: if trigger.governor.priority < preferred_governor.priority:
preferred_governor = trigger.governor preferred_governor = trigger.governor
self.log.debug('preferred governor: %s', preferred_governor.name) self.log.debug('preferred governor: %s', preferred_governor)
return preferred_governor.name return preferred_governor
async def set_governor(self, governor_name: str) -> None:
if self.governor_control.current_governor is None:
self.log.debug("unable to retrieve current governor")
return
if self.governor_control.current_governor.name == governor_name:
self.log.debug("governor is already set to: %s", governor_name)
return
self.governor_control.set_governor(governor_name)
async def start_trigger(self, _trigger: Trigger) -> None: async def start_trigger(self, _trigger: Trigger) -> None:
"""Start a new trigger.""" """Start a new trigger."""
@@ -75,9 +64,9 @@ class TriggerScheduler(AppClass):
self.loop.add_signal_handler(sig, partial(signal_handler, sig=signal.SIGINT)) self.loop.add_signal_handler(sig, partial(signal_handler, sig=signal.SIGINT))
try: try:
self.loop.create_task(self.governor_control.run())
while True: while True:
preferred_governor = self.establish_preferred_governor() self.governor_control.governor = self.establish_preferred_governor()
await self.schedule_task(self.set_governor, preferred_governor)
await asyncio.sleep(1) # Keep the main function alive await asyncio.sleep(1) # Keep the main function alive
except asyncio.exceptions.CancelledError: except asyncio.exceptions.CancelledError:
pass pass
+1 -1
View File
@@ -1,6 +1,6 @@
[project] [project]
name = "cpu_governor_auto_adjust" name = "cpu_governor_auto_adjust"
version = "0.5.17" version = "0.5.19"
description = "This application has been developed to automatically change cpu governor based on certain triggers." description = "This application has been developed to automatically change cpu governor based on certain triggers."
authors = [ authors = [
{ name = "Martin Reurekas", email = "martin@semrks.nl" } { name = "Martin Reurekas", email = "martin@semrks.nl" }