simplifies @task decorator (updates types), moves task logic into Task's run_task()

This commit is contained in:
Mose Müller 2024-08-06 11:32:12 +02:00
parent 96cc7b31b4
commit c0e5a77d6f
2 changed files with 15 additions and 14 deletions

View File

@ -1,5 +1,3 @@
import asyncio
import functools
import logging
from collections.abc import Callable, Coroutine
from typing import Any, TypeVar
@ -13,18 +11,17 @@ R = TypeVar("R")
def task(
*, autostart: bool = False
) -> Callable[[Callable[[Any], Coroutine[None, None, R]]], Task[R]]:
) -> Callable[
[
Callable[[Any], Coroutine[None, None, R]]
| Callable[[], Coroutine[None, None, R]]
],
Task[R],
]:
def decorator(
func: Callable[[Any], Coroutine[None, None, R]],
func: Callable[[Any], Coroutine[None, None, R]]
| Callable[[], Coroutine[None, None, R]],
) -> Task[R]:
@functools.wraps(func)
async def wrapper(self: Any) -> R | None:
try:
return await func(self)
except asyncio.CancelledError:
logger.info("Task '%s' was cancelled", func.__name__)
return None
return Task(wrapper, autostart=autostart)
return Task(func, autostart=autostart)
return decorator

View File

@ -96,7 +96,11 @@ class Task(pydase.data_service.data_service.DataService, Generic[R]):
logger.info("Starting task %r", self._func_name)
self._status = TaskStatus.RUNNING
res: Coroutine[None, None, R] = self._bound_func()
return await res
try:
return await res
except asyncio.CancelledError:
logger.info("Task '%s' was cancelled", self._func_name)
return None
logger.warning(
"Cannot start task %r. Function has not been bound yet", self._func_name
)