Documentation ¶
Index ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func Init ¶
Init checks if the current process has been created by Spawn.
If no, it returns nil and the original program can continue unmodified.
If no, it hijacks the process to run as a child worker controlled by its parent over a beam connection, with f exposed as a remote service. In this case Init never returns.
The hijacking process takes place as follows:
- Open file descriptor 3 as a beam endpoint. If this fails, terminate the current process.
- Start a new engine.
- Call f.Install on the engine. Any handlers registered will be available for remote invocation by the parent.
- Listen for beam messages from the parent and pass them to the handlers.
- When the beam endpoint is closed by the parent, terminate the current process.
NOTE: Init must be called at the beginning of the same program calling Spawn. This is because Spawn approximates a "fork" by re-executing the current binary - where it expects spawn.Init to intercept the control flow and execute the worker code.
func Spawn ¶
Spawn starts a new Engine in a child process and returns a proxy Engine through which it can be controlled.
The commands available on the child engine are determined by an earlier call to Init. It is important that Init be called at the very beginning of the current program - this allows it to be called as a re-execution hook in the child process.
Long story short, if you want to expose `myservice` in a child process, do this:
func main() { spawn.Init(myservice) [..] child, err := spawn.Spawn() [..] child.Job("dosomething").Run() }
Types ¶
This section is empty.