Skip to main content
PipeTo runs a task asynchronously and delivers its result (or failure) to a target actor’s mailbox. Use it to offload I/O or CPU-bound work without blocking the actor, while keeping the result in the actor model. Note: PipeTo can only be invoked by local actors. Calling pid.PipeTo or ctx.PipeTo when the sender (pid or ctx.Self()) is a remote PID returns ErrNotLocal. The task runs in a goroutine on the caller’s node; remote PIDs do not have a local execution context to run it.

API

From ReceiveContext

From PID

From GrainContext

Failure semantics differ for grain targets: a failed task delivers a *StatusFailure message to the target grain instead of going to the dead-letter queue. PipeToActor follows the actor semantics below. See Grain PipeTo for the grain-side API and example.

Task signature

  • On success: the any result is sent to the target as a normal message.
  • On failure: the error is forwarded to the dead-letter queue, unless WithCircuitBreaker is used and the breaker is open (in which case the outcome is dropped).
The task runs on its own goroutine, not on the mailbox thread, so it must not read or write actor state. A field the task reads while a later message handler writes it is a genuine data race, and it is the one way to reintroduce the problem the actor model removes. Copy what the task needs into local variables first, return the result, and mutate state when the result arrives as a message.

PipeOption

Only one of WithTimeout or WithCircuitBreaker may be used per call. Using both returns ErrOnlyOneOptionAllowed.

Example

The aggregator actor receives the *http.Response (or the task fails and the error is handled per options).