diff --git a/pyAmakCore/classes/scheduler_tool/callable.py b/pyAmakCore/classes/scheduler_tool/callable.py index f6f4a5163efae0eff9ab707f287bef727788eb33..b57e8948ce954146775cd9b673585e3cd65d49be 100644 --- a/pyAmakCore/classes/scheduler_tool/callable.py +++ b/pyAmakCore/classes/scheduler_tool/callable.py @@ -1,15 +1,24 @@ """ class Callable """ +import pathlib +import sys from threading import Semaphore -class Callable: +sys.path.insert(0, str(pathlib.Path(__file__).parent)) + +from pyAmakCore.classes.scheduler_tool.scheduler_state import State +from pyAmakCore.classes.scheduler_tool.savable import Savable + + +class Callable(Savable): """ Class that implement useful method to interact with the program """ - def __init__(self) -> None: + def __init__(self, amas) -> None: + super().__init__(amas) self.exit_bool: bool = False self.sleep_time: float = 0 @@ -26,12 +35,14 @@ class Callable: """ Unlock the scheduler """ + self.state = State.RUNNING self.semaphore_start_stop.release() def stop(self) -> None: """ Lock the scheduler """ + self.state = State.WAITING self.semaphore_start_stop.acquire() def set_sleep(self, sleep_time: int) -> None: diff --git a/pyAmakCore/classes/scheduler_tool/savable.py b/pyAmakCore/classes/scheduler_tool/savable.py index ade770292815e2253734aebac4196b6add66d073..4c1294b578602bfc9494c1fc2f84d158342e667a 100644 --- a/pyAmakCore/classes/scheduler_tool/savable.py +++ b/pyAmakCore/classes/scheduler_tool/savable.py @@ -2,20 +2,25 @@ Savable Class """ import pickle + import sys import pathlib sys.path.insert(0, str(pathlib.Path(__file__).parent)) from pyAmakCore.classes.amas import Amas +from pyAmakCore.classes.scheduler_tool.scheduler_state import State class Savable: """ Class that implement convenient method to save and load an amas """ + def __init__(self, amas: Amas) -> None: - self.amas = amas + self.amas: Amas = amas + self.state: State = State.RUNNING + self.save_path = None def get_amas(self): """ @@ -23,12 +28,23 @@ class Savable: """ return self.amas - def save(self, file="filename.pickle") -> None: + def _dump(self, file): """ Save the current state of the system """ with open(file, 'wb') as handle: - pickle.dump(self.amas, handle, protocol=pickle.HIGHEST_PROTOCOL) + pickle.dump(self.amas, handle, protocol=pickle.HIGHEST_PROTOCOL) + + def save(self, file="filename.pickle") -> None: + """ + try to save if scheduler is not working + """ + + if self.state == State.RUNNING: + self.save_path = file + self.state = State.NEED_TO_SAVE + if self.state == State.WAITING: + self._dump(file) @classmethod def load(cls, file="filename.pickle") -> 'Savable': diff --git a/pyAmakCore/classes/scheduler_tool/scheduler_core.py b/pyAmakCore/classes/scheduler_tool/scheduler_core.py index 15ef702597b505a1f5266d772d4ca3940dd96484..c95aa13039fadf702d5309f16f7dfe1d00f4771a 100644 --- a/pyAmakCore/classes/scheduler_tool/scheduler_core.py +++ b/pyAmakCore/classes/scheduler_tool/scheduler_core.py @@ -6,6 +6,8 @@ from time import sleep import sys import pathlib +from pyAmakCore.classes.scheduler_tool.scheduler_state import State + sys.path.insert(0, str(pathlib.Path(__file__).parent)) from pyAmakCore.classes.scheduler_tool.callable import Callable @@ -19,9 +21,7 @@ class SchedulerCore(Callable, Savable): """ def __init__(self, amas: Amas) -> None: - - Callable.__init__(self) - Savable.__init__(self, amas) + Callable.__init__(self, amas) def first_part(self) -> None: """ @@ -38,6 +38,13 @@ class SchedulerCore(Callable, Savable): last part of a cycle """ + def try_to_save(self): + """ + try to save scheduler if need to + """ + if self.state == State.NEED_TO_SAVE: + self._dump(self.save_path) + def run(self) -> None: """ main part of amak core @@ -45,6 +52,7 @@ class SchedulerCore(Callable, Savable): while not self.exit_bool: print("Cycle : ", self.amas.get_cycle()) + self.try_to_save() self.semaphore_start_stop.acquire() if self.exit_bool: break @@ -54,4 +62,5 @@ class SchedulerCore(Callable, Savable): self.main_part() self.last_part() + self.try_to_save() sleep(self.sleep_time) diff --git a/pyAmakCore/classes/scheduler_tool/scheduler_state.py b/pyAmakCore/classes/scheduler_tool/scheduler_state.py new file mode 100644 index 0000000000000000000000000000000000000000..af657e326a26de4fb7bd06218abd391a5461da0b --- /dev/null +++ b/pyAmakCore/classes/scheduler_tool/scheduler_state.py @@ -0,0 +1,25 @@ +""" +Scheduler State +""" +from enum import Enum, auto + + +class State(Enum): + """ + Scheduler State + """ + + """ + Scheduler is waiting + """ + WAITING = auto() + + """ + Scheduler is running + """ + RUNNING = auto() + + """ + Scheduler is running and should save as soon as possible + """ + NEED_TO_SAVE = auto() diff --git a/pyAmakCore/tests/memory_leak/main.py b/pyAmakCore/tests/memory_leak/main.py index bf6126ad4094e2c0070beda58cda0a19adf4d0e1..7ca9c887df0d4013bd45f3e3343e6bd4d2c62539 100644 --- a/pyAmakCore/tests/memory_leak/main.py +++ b/pyAmakCore/tests/memory_leak/main.py @@ -23,6 +23,12 @@ class SimpleAmas(Amas): class SimpleEnv(Environment): pass +class SimpleSchedulerMono(SchedulerMono): + + def last_part(self) -> None: + super().last_part() + self.save("test.pickle") + import time start_time = time.time() ToOverrideWarning.enable_warning(False) @@ -31,7 +37,7 @@ env = SimpleEnv() amas = SimpleAmas(env) #scheduler = Scheduler(amas) -scheduler = SchedulerMono(amas) +scheduler = SimpleSchedulerMono(amas) scheduler.start() scheduler.run() diff --git a/release/changelog.txt b/release/changelog.txt index 25aa62f7579dfa281af470072720a23379981c3d..2848db18688ddd6ef1776a36348d8617616c202a 100644 --- a/release/changelog.txt +++ b/release/changelog.txt @@ -1,9 +1,13 @@ +v0.1.2: + * Add : Save & load can now accept path to save & load file + * Fix : You could save in a middle of a cycle, which makes the backup file corrupted + V0.1.1: * Add mono threading scheduler * Add seed in environment v0.1.0: - WARNING : all previous example will no longer work in this version, and all v0.1.0+ example won't work in previous version + WARNING : all previous example will no longer work in this version, and all v0.1.0+ example won't work in previous version (need to create a scheduler) * Way better thread management * Add save and load diff --git a/release/pyAmakCore-0.1.2-py3-none-any.whl b/release/pyAmakCore-0.1.2-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..3b37e35a090234ae91a75ed970e6898c197c17a3 Binary files /dev/null and b/release/pyAmakCore-0.1.2-py3-none-any.whl differ diff --git a/setup.py b/setup.py index 0ffadb01de7044e1021a83a3549e8a926d2a0c2b..39a2835ca6112bbf65e00a3141cc359165e39189 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ from setuptools import setup, find_packages setup( name='pyAmakCore', packages=find_packages(), - version='0.1.1', + version='0.1.2', description='AmakFramework in python', author='BE', install_requires=[],