Parallel Execution
Utah supports running function calls concurrently using the parallel keyword. This compiles to bash background execution with &.
Basic Syntax
Prefix a function call with parallel to run it in the background:
parallel functionName(args);
Use wait (via a raw bash expression) to block until all background jobs complete:
let _ = "$(wait)";
Examples
Running Functions in Parallel
function slowEcho(msg: string): void {
console.log("Start: ${msg}");
let _ = "$(sleep 1)";
console.log("End: ${msg}");
}
console.log("Main start");
parallel slowEcho("A");
parallel slowEcho("B");
console.log("Main end");
let _ = "$(wait)";
console.log("All done");
Generated Bash:
slowEcho() {
local msg="$1"
echo "Start: ${msg}"
_="$(sleep 1)"
echo "End: ${msg}"
}
echo "Main start"
slowEcho "A" &
slowEcho "B" &
echo "Main end"
_="$(wait)"
echo "All done"
Both slowEcho("A") and slowEcho("B") run simultaneously. The main script continues to print "Main end" immediately, then wait blocks until both background jobs finish.
File Processing Pipeline
function processFile(path: string): void {
console.log("Processing: ${path}");
let _ = "$(sleep 2)";
console.log("Done: ${path}");
}
parallel processFile("data1.csv");
parallel processFile("data2.csv");
parallel processFile("data3.csv");
let _ = "$(wait)";
console.log("All files processed");
Parallel with Process Management
For more control over individual background tasks, combine parallel with process.start() and process.waitForExit():
// Simple parallel with the parallel keyword
parallel buildFrontend();
parallel buildBackend();
let _ = "$(wait)";
// Advanced parallel with process management
let pid1: number = process.start("npm run build:frontend");
let pid2: number = process.start("npm run build:backend");
let result1: number = process.waitForExit(pid1, 300000);
let result2: number = process.waitForExit(pid2, 300000);
if (result1 == 0 && result2 == 0) {
console.log("Both builds succeeded");
}
Generated Bash
The parallel keyword appends & to the compiled function call, sending it to the background:
# parallel slowEcho("A");
slowEcho "A" &
# parallel slowEcho("B");
slowEcho "B" &
# let _ = "$(wait)";
_="$(wait)"
Notes
parallelworks with any user-defined function.- Background jobs share the same stdout/stderr as the parent script, so output from parallel calls may interleave.
- Use
waitto synchronize before continuing with code that depends on the parallel results. - For finer control (exit codes, timeouts, process monitoring), see System Functions — specifically
process.start(),process.waitForExit(), andprocess.kill().