Processes
| Spawn | |
| Send messages | |
| Receive them | |
| Link and monitor note |
Spawn
The spawn call starts a tiny process running the given function and returns its pid immediately. Processes share nothing and run at the same time, scheduled by the virtual machine. Keeping the first example quiet avoids print order surprises.
pid = spawn(fn -> Process.sleep(100) end)
IO.inspect(is_pid(pid))
true
Send messages
The send call drops a message into the mailbox of the target process and returns the message itself. Sending never blocks, so the sender moves on while the note waits in the queue. Any Elixir term works as a message, and tuples with atoms are the common shape.
pid = spawn(fn -> Process.sleep(100) end)
IO.inspect(send(pid, {:hello, :world}))
{:hello, :world}
Receive them
The receive block scans the mailbox for a message matching one of its patterns and binds the result. The first matching clause wins, and the process waits until a match arrives. Here the new process notifies its parent, which then prints the greeting.
parent = self()
spawn(fn -> send(parent, :hi) end)
receive do
msg -> IO.inspect(msg)
end
:hi
Link and monitor note
A link ties two processes so that an exit in one takes down the other, which is the foundation supervisors build on. A monitor is gentler: the watcher gets a DOWN message while the watched process never hears back. Prefer monitors for observers and leave links to supervision trees.
pid = spawn(fn -> :ok end)
Process.monitor(pid)
receive do
{:DOWN, _ref, :process, _pid, _reason} -> IO.puts("done")
end
done
Next: GenServer
Article author: Arthur Isaev