Add All Folders
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
from typing import List
|
||||
from radiuma_api.task import Task, Status, TaskEvent
|
||||
from radiuma_api.execution_context import ExecutionContext
|
||||
from radiuma_api.scheduler import Scheduler
|
||||
from radiuma_api.io_port import CompatibilityException
|
||||
# Write Codes Here:
|
||||
|
||||
|
||||
class Workflow(Task):
|
||||
"""Composite node: aggregates Tasks (Modules or other Workflows)."""
|
||||
|
||||
def __init__(self, name: str):
|
||||
super().__init__(name)
|
||||
self.children: List[Task] = []
|
||||
|
||||
def add_child(self, task: Task):
|
||||
task.parent_task = self
|
||||
self.children.append(task)
|
||||
|
||||
def run(self, context: ExecutionContext):
|
||||
"""Delegate execution of children to Scheduler."""
|
||||
self._set_status(Status.RUNNING)
|
||||
scheduler = Scheduler()
|
||||
|
||||
for child in self.children:
|
||||
if self.status == Status.STOPPED:
|
||||
break
|
||||
|
||||
try:
|
||||
if child.check_inputs_ready(context):
|
||||
scheduler.run(child, context)
|
||||
else:
|
||||
print(f"Task {child.name} not ready, skipping.")
|
||||
except CompatibilityException as e:
|
||||
self._emit(TaskEvent.ON_ERROR, {"error": e.reason, "task": child.name})
|
||||
child._set_status(Status.FAILED)
|
||||
|
||||
# Final status evaluation
|
||||
if all(c.status == Status.COMPLETED for c in self.children):
|
||||
self._set_status(Status.COMPLETED)
|
||||
elif any(c.status == Status.FAILED for c in self.children):
|
||||
self._set_status(Status.FAILED)
|
||||
else:
|
||||
self._set_status(Status.STOPPED)
|
||||
Reference in New Issue
Block a user