aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--aggro.py24
-rw-r--r--app/MemoryState.py11
-rw-r--r--app/PluginManager.py9
3 files changed, 37 insertions, 7 deletions
diff --git a/aggro.py b/aggro.py
index 8e4f908..b5c6ce0 100644
--- a/aggro.py
+++ b/aggro.py
@@ -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)