Install
openclaw skills install openclaw-skill-parallel-tasksExecute multiple tasks in parallel with timeout protection, error isolation, and real-time progress feedback. Use when user says "run these in parallel", "parallel execution", "concurrent tasks", or wants multiple independent tasks done simultaneously with proper error handling and timeout control.
openclaw skills install openclaw-skill-parallel-tasksExecute multiple tasks in parallel with enterprise-grade reliability: timeout protection, error isolation, and real-time progress feedback.
Use this skill when:
Serial vs Parallel:
SERIAL (slow):
Task 1 → Task 2 → Task 3 (5min + 5min + 5min = 15min)
PARALLEL (fast):
Task 1 ─┬─> (5min total, not 15min)
Task 2 ─┼─>
Task 3 ─┘
/parallel
- Task 1: Search for docs
- Task 2: Search for code
- Task 3: Search for examples
/parallel timeout=300
- [search-docs] Search for relevant documentation
- [search-code] Find similar implementations
- [analyze] Analyze the results
# Simple usage
node scripts/executor.ts "Research AI trends" "Research market analysis"
# Named tasks with custom timeout
node scripts/executor.ts --timeout 600 \
--task "[research] Research AI trends" \
--task "[implement] Build the feature"
# Read from file (one task per line)
node scripts/executor.ts --tasks-file my-tasks.txt --max-concurrent 3
# Named task formats (all equivalent):
# - [name] description
# - - description (auto-named as task-1, task-2, ...)
# - 1. description
The executor uses a semaphore pattern with configurable concurrency:
// 1. Parse tasks from input
const tasks = parseTaskInput(input)
// 2. Execute tasks with concurrency control
const results: TaskResult[] = []
const executing: Promise<void>[] = []
for (const task of tasks) {
// Wait if at max concurrency
if (executing.length >= maxConcurrent) {
await Promise.race(executing)
}
const promise = runTask(task).then(result => {
results.push(result)
// Remove from executing list
const idx = executing.indexOf(promise)
if (idx > -1) executing.splice(idx, 1)
})
executing.push(promise)
}
await Promise.all(executing)
async function executeTaskViaSpawn(
task: Task,
timeoutSeconds: number
): Promise<TaskResult> {
const taskId = `parallel-${Date.now()}-${randomId()}`
return new Promise((resolve) => {
const proc = spawn('hermes', [
'cli', '--',
'sessions_spawn',
'--task', `"${task.description}"`,
'--label', `"${task.name}"`,
'--timeout', String(timeoutSeconds),
'--session-id', taskId
], { stdio: ['ignore', 'pipe', 'pipe'] })
// Timeout handling
const timeoutId = setTimeout(() => {
proc.kill('SIGTERM')
resolve({
name: task.name,
status: 'timeout',
duration: Date.now() - startTime,
error: `Exceeded ${timeoutSeconds}s timeout`
})
}, timeoutSeconds * 1000)
proc.on('close', (code, signal) => {
clearTimeout(timeoutId)
if (signal === 'SIGTERM') {
resolve({ name: task.name, status: 'timeout', ... })
} else if (code === 0) {
resolve({ name: task.name, status: 'fulfilled', ... })
} else {
resolve({ name: task.name, status: 'rejected', ... })
}
})
})
}
| Option | Default | Description |
|---|---|---|
timeout | 300 | Default timeout per task (seconds) |
| Per-task timeout | - | Override global timeout for specific tasks |
Behavior: Task auto-terminates after timeout, other tasks continue.
Each task runs in complete isolation:
| Problem | Serial | Parallel (This Skill) |
|---|---|---|
| One task fails | All others stop | Only failed task affected |
| One task hangs | Blocks entire flow | Others continue normally |
| One task times out | May cascade | Contained, others finish |
| Option | Default | Description |
|---|---|---|
maxConcurrent | 5 | Maximum tasks running simultaneously |
Pattern: Semaphore-style - starts N tasks, when one completes, starts next.
Real-time terminal output with colored status:
🚀 Starting 3 tasks in parallel (max 5 concurrent)...
🔄 [task-1] Starting (timeout: 300s)...
🔄 [task-2] Starting (timeout: 300s)...
🔄 [task-3] Starting (timeout: 300s)...
✅ [1/3] [task-1] Complete (23.5s)
✅ [2/3] [task-2] Complete (45.2s)
⏱️ [3/3] [task-3] Timeout after 300s
[research] Research AI trends and write report
[implement] Build the feature
[test] Write comprehensive tests
- Search for API documentation
- Find relevant code examples
- Check for existing implementations
1. Research authentication patterns
2. Design database schema
3. Implement API endpoints
Research AI trends
Build the feature
Write tests
→ Auto-named: task-1, task-2, task-3
✅ Parallel Execution Complete
3 tasks: 2 succeeded, 1 failed (45.2s total)
┌─────────────────────┬────────────┬────────────┐
│ Task │ Status │ Duration │
├─────────────────────┼────────────┼────────────┤
│ research │ ✅ fulfilled│ 23.5s │
│ implement │ ✅ fulfilled│ 45.2s │
│ test │ ⏱️ timeout │ 300.0s │
└─────────────────────┴────────────┴────────────┘
❌ Failed Tasks:
• test: Exceeded 300s timeout
| Code | Meaning |
|---|---|
| 0 | All tasks succeeded |
| 1 | Some tasks failed or timed out |
| Option | Default | Description |
|---|---|---|
--timeout, -to | 300 | Timeout per task (seconds) |
--max-concurrent, -m | 5 | Max concurrent tasks |
--stop-on-error | false | Stop all if one fails |
--no-progress | false | Suppress progress output |
--tasks-file, -f | - | Read tasks from file |
--parse | - | Parse stdin to JSON |
[name] description (timeout=600)
| Status | Cause | Behavior |
|---|---|---|
fulfilled | Task succeeded | Returns result value |
timeout | Exceeded timeout | Task terminated, others continue |
rejected | Process error | Error captured, others continue |
cancelled | User cancelled | All running tasks terminate |
no_reply | No output | Reported as warning |
node scripts/executor.ts \
"Research Claude Code best practices" \
"Find OpenClaw skill examples" \
"Search for agent design patterns"
# tasks.txt:
# [research] Research AI trends
# [implement] Build the feature
# [test] Write tests
node scripts/executor.ts --tasks-file tasks.txt --timeout 600
node scripts/executor.ts --timeout 600 \
--task "[backend] Implement user authentication API" \
--task "[frontend] Build login form component" \
--task "[database] Create users table migration"
node scripts/executor.ts \
--task "[store1] Fetch product data from store1.com" \
--task "[store2] Fetch product data from store2.com" \
--task "[store3] Fetch product data from store3.com"
❌ Don't use for dependent tasks:
# WRONG - second task depends on first!
node scripts/executor.ts \
"Create user account" \
"Send welcome email"
Use sequential execution instead.
❌ Don't use for very fast tasks:
# WRONG - spawning overhead not worth it
node scripts/executor.ts "Read file A" "Read file B" "Read file C"
The overhead of spawning parallel sessions isn't worth it for sub-second tasks.
subagents - Background agent spawningbatch-operations - Bulk file operationsworkflow-orchestrator - Complex multi-step workflows