All Elixir code runs inside lightweight threads of execution (called processes) that are isolated and exchange information via messages:

current_process = self () # Spawn an Elixir process (not an operating system one!) spawn_link ( fn -> send ( current_process , { :msg , "hello world" }) end ) # Block until the message is received receive do { :msg , contents } -> IO . puts ( contents ) end

Due to their lightweight nature, it is not uncommon to have hundreds of thousands of processes running concurrently in the same machine. Isolation allows processes to be garbage collected independently, reducing system-wide pauses, and using all machine resources as efficiently as possible (vertical scaling).

Processes are also able to communicate with other processes running on different machines in the same network. This provides the foundation for distribution, allowing developers to coordinate work across multiple nodes (horizontal scaling).