pub struct TaskExecutor {
pub graph: TaskGraph,
pub max_concurrent: usize,
pub max_retries: u32,
}Expand description
Parallel wave-based executor for a TaskGraph.
§Usage
ⓘ
let executor = TaskExecutor::new(graph)
.with_max_concurrent(4)
.with_max_retries(2);
let report = executor.run(llm, tools, tool_ctx, io).await?;
println!("completed: {}", report.task_results.len());§Execution Model
The executor runs a loop:
loop:
1. Find all Pending tasks whose deps are all Completed → "ready set"
2. If ready.is_empty() && nothing running && not finished → deadlock (error)
3. Dispatch up to (max_concurrent - running) tasks from the ready set
4. Wait for ONE task to finish (JoinSet::join_next)
5. On success → mark_completed, store result
On failure → if retries < max_retries: reset_for_retry (will be re-queued)
else: mark_failed, cancel all downstream dependents
6. Repeat until graph.is_finished()Fields§
§graph: TaskGraphThe task graph being executed.
Made pub so callers can inspect it after a failed run.
max_concurrent: usizeMaximum number of tasks that may be executing concurrently. Default: 4.
max_retries: u32How many times a task may be retried before it is permanently failed. Default: 2.
Implementations§
Source§impl TaskExecutor
impl TaskExecutor
Sourcepub fn new(graph: TaskGraph) -> Self
pub fn new(graph: TaskGraph) -> Self
Create an executor with default settings (4 concurrent, 2 retries).
Sourcepub fn with_max_concurrent(self, n: usize) -> Self
pub fn with_max_concurrent(self, n: usize) -> Self
Override the maximum concurrency (number of tasks running at once).
Sourcepub fn with_max_retries(self, n: u32) -> Self
pub fn with_max_retries(self, n: u32) -> Self
Override the per-task retry limit.
Sourcepub async fn run(
self,
llm: Arc<dyn LlmProvider>,
tools: Arc<ToolRegistry>,
tool_ctx: ToolContext,
io: Arc<dyn AgentIO>,
) -> Result<ExecutionReport>
pub async fn run( self, llm: Arc<dyn LlmProvider>, tools: Arc<ToolRegistry>, tool_ctx: ToolContext, io: Arc<dyn AgentIO>, ) -> Result<ExecutionReport>
Execute the task graph, returning a report when all tasks finish.
§Parameters
llm— LLM provider shared across all tasks (thread-safe Arc).tools— Tool registry shared across all tasks.tool_ctx— Per-execution tool context (cloned for each task).io— I/O channel for progress output.
§Errors
Returns an error if:
- The graph enters a deadlock (tasks remain but none are ready or running).
- A spawned tokio task panics (join error).
Auto Trait Implementations§
impl Freeze for TaskExecutor
impl RefUnwindSafe for TaskExecutor
impl Send for TaskExecutor
impl Sync for TaskExecutor
impl Unpin for TaskExecutor
impl UnsafeUnpin for TaskExecutor
impl UnwindSafe for TaskExecutor
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more