| name | golem-parallel-workers-scala |
| description | Fan out work to multiple parallel agents and collect results in a Scala Golem project. Use when the user asks about parallel execution, fan-out/fan-in, spawning child agents for parallel work, forking, or aggregating results from multiple agents. |
Parallel Workers — Fan-Out / Fan-In (Scala)
Overview
Golem agents process invocations sequentially — a single agent cannot run work in parallel. To execute work concurrently, distribute it across multiple agent instances. This skill covers two approaches:
- Child agents via codegen-generated
XClient.get(id) — spawn separate agent instances, dispatch work, and collect results
HostApi.fork() — clone the current agent at the current execution point for lightweight parallel execution
Approach 1: Child Agent Fan-Out
Spawn child agents, dispatch work, and collect results using Future.sequence or Golem promises.
Basic Pattern with Future.sequence
import golem.*
import golem.runtime.annotations.{agentDefinition, agentImplementation}
import scala.concurrent.Future
import scala.scalajs.concurrent.JSExecutionContext.Implicits.queue
@agentDefinition()
trait Coordinator extends BaseAgent {
class Id()
def fanOut(items: List[String]): Future[List[String]]
}
@agentImplementation()
class CoordinatorImpl() extends Coordinator {
override def fanOut(items: List[String]): Future[List[String]] = {
// Spawn one child per item and call concurrently
val futures = items.zipWithIndex.map { case (item, i) =>
val child = WorkerClient.get(i)
child.process(item)
}
// Wait for all children to finish
Future.sequence(futures)
}
}
@agentDefinition()
trait Worker extends BaseAgent {
class Id(val id: Int)
def process(data: String): Future[String]
}
@agentImplementation()
class WorkerImpl(private val id: Int) extends Worker {
override def process(data: String): Future[String] = {
Future.successful(s"processed-$data")
}
}