You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat: Implementiere MQTT Command-Handling und Architektur-Refactoring
Integriert einen dedizierten MQTT Command-Listener und refaktoriert die Publisher/Controller-Beziehung für direktes Command-Handling.
- feat(mqtt): MqttPublisher verarbeitet Commands nun intern über `_handle_command`
- refactor(controller): Controller injiziert MqttPublisher für Heartbeats und direkten Zugriff
- perf(protocols): Optimierung der Demodulationsschleife für inaktive Protokolle in `message_unsynced.py`
- fix(main): Auflösung der zirkulären Abhängigkeit zwischen Controller und Publisher
- test: Anpassung der Testsuite an neue Architektur und Mocking-Strategie
Copy file name to clipboardExpand all lines: AGENTS.md
+13-3Lines changed: 13 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -253,22 +253,32 @@ Dieser Architecture-First Development Process ist für **alle** neuen Funktionen
253
253
254
254
Die Einhaltung dieses Prozesses gewährleistet, dass Design-Entscheidungen bewusst getroffen, dokumentiert und nachvollziehbar sind, was die langfristige Wartbarkeit, Skalierbarkeit und Qualität des PySignalduino-Projekts sicherstellt.
255
255
256
-
## Fehlerbehebungsprozess für fehlende Abhängigkeiten
257
-
256
+
## Fehlerbehebungsprozess
258
257
### Problemidentifikation
259
258
1.**Symptom:** ImportError oder ModuleNotFoundError während der Testausführung
260
259
2.**Ursachenanalyse:**
261
260
- Überprüfen der Traceback-Meldung auf fehlende Module
262
261
- Vergleich mit requirements.txt und requirements-dev.txt
263
262
- Prüfen der Dokumentation auf Installationsanweisungen
264
263
265
-
### Lösungsimplementierung
264
+
### Lösungsimplementierung (Abhängigkeiten)
266
265
1.**requirements-dev.txt aktualisieren:**
267
266
- Modulname zur Datei hinzufügen
268
267
- Commit mit Conventional Commits Syntax erstellen (z.B. "fix: add <module> to requirements-dev.txt")
269
268
2.**Dokumentation prüfen:**
270
269
- Sicherstellen, dass Installationsanweisungen in README.md und docs/ aktuell sind
271
270
271
+
### Problemidentifikation (Hohe CPU-Last im Parser)
272
+
1.**Symptom:** Anhaltende 100% CPU-Auslastung auf einem oder mehreren Kernen während des Parsens von MU/MC-Nachrichten.
273
+
2.**Ursachenanalyse:**
274
+
-**Parser-Architektur prüfen:** Der gesamte Parservorgang sollte in [`signalduino/controller.py`](signalduino/controller.py) über `asyncio.to_thread` abgewickelt werden.
275
+
-**Protokoll-Ineffizienz:** Die synchrone Demodulationsschleife in [`sd_protocols/message_unsynced.py`](sd_protocols/message_unsynced.py) oder [`sd_protocols/manchester.py`](sd_protocols/manchester.py) blockiert den Worker-Thread zu lange.
276
+
3.**Validierung:** Temporäres Hinzufügen von Zeit-Logging (z.B. mit `time.perf_counter()`) in der Protokollschleife in `demodulate_mu` zur Identifizierung des blockierenden Protokolls.
277
+
278
+
### Lösungsimplementierung (Parser-Performance)
279
+
1.**Backtracking-Hölle vermeiden:** Wenn ein Protokoll eine sehr lange Demodulationszeit (z.B. > 10ms) aufweist, liegt wahrscheinlich ein Catastrophic Backtracking in einem regulären Ausdruck vor.
280
+
2 **Deaktivierung inaktiver Protokolle:** Die `active`-Prüfung in `demodulate_mu` sollte verwendet werden, um inaktive Protokolle auszuschließen.
Copy file name to clipboardExpand all lines: docs/ASYNCIO_MIGRATION.md
+24Lines changed: 24 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -194,6 +194,30 @@ Vergessene `await`‑Schlüsselwörter führen zu `RuntimeWarning` oder hängen
194
194
195
195
Wenn Sie Threads und asyncio mischen müssen (z.B. für Legacy‑Code), verwenden Sie `asyncio.run_coroutine_threadsafe()` oder `loop.call_soon_threadsafe()`.
196
196
197
+
### 4. Async-Busy-Loops und CPU-Auslastung (100%)
198
+
199
+
Wenn `asyncio.Queue.get()` in einer `while True`-Schleife ständig Elemente zurückgibt (z.B. bei hohem Nachrichtenaufkommen), kann die Co-Routine den Event-Loop dominieren, selbst wenn die schwere Arbeit in einem Thread-Pool ausgelagert wird. Dies führt zu hoher CPU-Auslastung und sporadischer Bearbeitung anderer Async-Tasks.
200
+
201
+
**Lösung:** Stellen Sie in schnell laufenden Verarbeitungsschleifen sicher, dass ein expliziter Yield-Punkt vorhanden ist, um anderen Tasks die Kontrolle zu übergeben.
202
+
203
+
```python
204
+
# Falsch (potenzielle Busy-Loop bei vollem Buffer)
205
+
# while not self._stop_event.is_set():
206
+
# item = await queue.get()
207
+
# process_item(item) # Wenn schnell, dominiert diese Task
0 commit comments