Source code for ewoksorange.gui.concurrency.base

import logging
from typing import Optional
from typing import Type

from ewokscore import TaskWithProgress
from ewokscore.task import Task
from ewokscore.task import TaskInputError

_logger = logging.getLogger(__name__)


[docs] class TaskExecutor: """Create and execute an Ewoks task""" def __init__(self, ewokstaskclass: Type[Task]) -> None: self.__ewokstaskclass = ewokstaskclass self.__task = None self.__task_init_exception = None
[docs] def create_task(self, log_missing_inputs: bool = False, **kwargs) -> None: if not issubclass(self.__ewokstaskclass, TaskWithProgress): kwargs.pop("progress", None) self.__task = None self.__task_init_exception = None try: self.__task = self.__ewokstaskclass(**kwargs) except TaskInputError as e: self.__task_init_exception = e if log_missing_inputs: _logger.error(f"task initialization failed: {e}", exc_info=True) else: _logger.info(f"task initialization failed: {e}")
[docs] def execute_task(self) -> None: if not self.has_task: return try: self.__task.execute() except Exception as e: _logger.error(f"task failed: {e}", exc_info=True)
@property def has_task(self) -> bool: return self.__task is not None @property def succeeded(self) -> Optional[bool]: """Returns `None` when the task was not or could not be instantiated""" if self.__task is None: return None return self.__task.succeeded @property def done(self) -> Optional[bool]: """Returns `None` when the task was not or could not be instantiated""" if self.__task is None: return None return self.__task.done @property def exception(self) -> Optional[Exception]: """The instantiation exception, the execution exception or `None`""" if self.__task_init_exception is not None: return self.__task_init_exception if self.__task is None: return None return self.__task.exception @property def output_variables(self) -> Optional[dict]: if self.__task is None: return dict() return self.__task.output_variables @property def current_task(self) -> Optional[Task]: return self.__task