From 24b2f70caf6ea932f3fb111b27c5d69cbd960167 Mon Sep 17 00:00:00 2001 From: Wolfgang Hottgenroth Date: Mon, 8 Dec 2025 16:20:25 +0100 Subject: [PATCH] better stopping --- apps/pulsegen/main.py | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/apps/pulsegen/main.py b/apps/pulsegen/main.py index 55487a5..7d6ccc4 100644 --- a/apps/pulsegen/main.py +++ b/apps/pulsegen/main.py @@ -176,14 +176,19 @@ async def mqtt_worker(shutdown_event: asyncio.Event) -> None: # Publish startup message await publish_example(client) - # Message loop + # Message loop with timeout to allow shutdown check async for message in client.messages: if shutdown_event.is_set(): + logger.info("Shutdown event detected, breaking message loop") break try: await handle_message(message, client) except Exception as e: logger.error(f"Error in message handler: {e}", exc_info=True) + + # If we exit the loop due to shutdown, break the reconnect loop too + if shutdown_event.is_set(): + break except asyncio.CancelledError: logger.info("MQTT worker cancelled") @@ -217,8 +222,17 @@ async def main() -> None: # Wait for shutdown signal await shutdown_event.wait() - # Wait for worker to finish - await worker_task + # Give worker a moment to finish gracefully + logger.info("Waiting for MQTT worker to finish...") + try: + await asyncio.wait_for(worker_task, timeout=5.0) + except asyncio.TimeoutError: + logger.warning("MQTT worker did not finish in time, cancelling...") + worker_task.cancel() + try: + await worker_task + except asyncio.CancelledError: + pass logger.info("Pulsegen application stopped")