From 053050a62c067604e4095a850e3943f1158c1e54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mose=20M=C3=BCller?= Date: Mon, 20 Jan 2025 06:10:48 +0100 Subject: [PATCH] tasks: return result of task after finishing gracefully Tasks that finished gracefully were restarted again. This fixes that. --- src/pydase/task/task.py | 2 +- tests/task/test_task.py | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/pydase/task/task.py b/src/pydase/task/task.py index 37fe163..79c9d74 100644 --- a/src/pydase/task/task.py +++ b/src/pydase/task/task.py @@ -169,7 +169,7 @@ class Task(pydase.data_service.data_service.DataService, Generic[R]): while True: try: - await self._func() + return await self._func() except asyncio.CancelledError: logger.info("Task '%s' was cancelled", self._func_name) raise diff --git a/tests/task/test_task.py b/tests/task/test_task.py index 1c7c24b..9a722e9 100644 --- a/tests/task/test_task.py +++ b/tests/task/test_task.py @@ -436,3 +436,24 @@ async def test_exit_on_failure_exceeding_rate_limit( await asyncio.sleep(0.5) assert "os.kill called with signal=" in caplog.text assert "Task 'my_task' encountered an exception" in caplog.text + + +@pytest.mark.asyncio(scope="function") +async def test_gracefully_finishing_task( + monkeypatch: pytest.MonkeyPatch, caplog: LogCaptureFixture +) -> None: + class MyService(pydase.DataService): + @task() + async def my_task(self) -> None: + print("Hello") + await asyncio.sleep(0.1) + + service_instance = MyService() + state_manager = StateManager(service_instance) + DataServiceObserver(state_manager) + service_instance.my_task.start() + + await asyncio.sleep(0.05) + assert service_instance.my_task.status == TaskStatus.RUNNING + await asyncio.sleep(0.1) + assert service_instance.my_task.status == TaskStatus.NOT_RUNNING