diff options
| author | Jan Tuomi <jans.tuomi@gmail.com> | 2023-09-02 19:53:41 +0300 |
|---|---|---|
| committer | Jan Tuomi <jans.tuomi@gmail.com> | 2023-09-10 19:01:00 +0300 |
| commit | 4745449cf847f27c3cbbca5cef2f1d9d02103692 (patch) | |
| tree | e637f293a3e0c431f3796624cb8a908d26ba1e8f | |
| parent | 52418884284b5bf0919c48cf4b02c3bd23dc9e97 (diff) | |
Stuff
| -rw-r--r-- | aggro.py | 24 | ||||
| -rw-r--r-- | app/MemoryState.py | 11 | ||||
| -rw-r--r-- | app/PluginManager.py | 9 |
3 files changed, 37 insertions, 7 deletions
@@ -1,9 +1,18 @@ import json import os - +import threading +import time from app.AggroConfig import AggroConfig +from app.MemoryState import memory_state from app.PluginManager import PluginManager + +def run_plugin_thread(): + print("Plugin thread starting...") + manager.run() + print("Plugin thread exiting...") + + if __name__ == "__main__": print("Starting aggro. Press CTRL-C to exit.") @@ -19,7 +28,16 @@ if __name__ == "__main__": manager = PluginManager(aggro_config) manager.build_plugin_instances() + memory_state.running = True + + plugin_thread = threading.Thread(target=run_plugin_thread) + plugin_thread.start() + try: - manager.run() + while memory_state.running: + time.sleep(0.1) except KeyboardInterrupt: - print("Exiting...") + memory_state.running = False + print("Waiting for threads to exit...") + plugin_thread.join() + print("Main thread exiting...") diff --git a/app/MemoryState.py b/app/MemoryState.py new file mode 100644 index 0000000..b5fe1f1 --- /dev/null +++ b/app/MemoryState.py @@ -0,0 +1,11 @@ +from dataclasses import dataclass + + +@dataclass +class MemoryState: + """MemoryState is a singleton class used for communicating between threads.""" + + running: bool + + +memory_state = MemoryState(running=False) diff --git a/app/PluginManager.py b/app/PluginManager.py index 2b616ca..3ec9d44 100644 --- a/app/PluginManager.py +++ b/app/PluginManager.py @@ -7,13 +7,13 @@ from app.Item import Item from app.PluginInterface import PluginInterface from app.AggroConfig import AggroConfig from app.utils import get_param +from app.MemoryState import memory_state class PluginManager: def __init__(self, config: AggroConfig) -> None: self._plugins: dict[str, Any] = {} self.plugin_instances: dict[str, PluginInterface] = {} - self.running = False self.config = config def load_plugin(self, plugin_name: str) -> None: @@ -21,6 +21,8 @@ class PluginManager: plugin_class = module.Plugin self._plugins[plugin_name] = plugin_class + # TODO instead of propagating procedurally, + # insert data into an next_node_id-identified input queue in tinydb def propagate(self, id: str, items: list[Item]): next_nodes: list[str] if id not in self.config.graph: @@ -32,7 +34,7 @@ class PluginManager: self.run_plugin_job(next_node_id, items) def run_plugin_job(self, id: str, items: list[Item] = []): - if not self.running: + if not memory_state.running: return plugin: PluginInterface = self.plugin_instances[id] @@ -65,7 +67,6 @@ class PluginManager: self.plugin_instances[id] = plugin def run(self) -> None: - self.running = True - while self.running: + while memory_state.running: schedule.run_pending() time.sleep(1) |
