Além do fato de o Erlang ter sido desenvolvido especificamente para ser executado em situações simultâneas / paralelizadas / distribuídas, as duas principais técnicas empregadas para tornar isso possível são:
Sem efeitos colaterais:
Isso significa que, quando você fornece a uma função um dado para executar, ela não afeta, exceto em casos muito rigorosos, qualquer outra coisa no sistema / processo em execução. Isso significa que se você executar uma função 300 vezes ao mesmo tempo simultaneamente, nenhuma dessas 300 execuções da função afetará nenhuma das outras.
A técnica de implementação para garantir que nenhum efeito colateral seja chamado de "imutabilidade", que significa aproximadamente, não pode ser alterada (alterada). Isso significa que, assim que você cria uma variável, o valor dessa variável não pode ser modificado. Erlang implementa esse comportamento com "atribuição única", portanto, depois de atribuir um valor a uma variável, você não poderá atribuir um valor a ela novamente.
X = 1.
X = 2. // This is not a valid operation
Isso garante que nenhum código possa alterar acidentalmente o valor de X, causando uma condição de corrida; portanto, é inerentemente seguro para threads e o uso simultâneo se torna trivial. Esse é um comportamento muito incomum entre linguagens de software e a maior maneira pela qual Erlang consegue ser tão adequado para execução simultânea.
O modelo do ator:
Essa é uma maneira específica de modelagem que demonstrou tornar a implementação e o gerenciamento do processamento simultâneo muito simples para os desenvolvedores. Direto da wikipedia (http://en.wikipedia.org/wiki/Actor_model):
O modelo de ator adota a filosofia de que tudo é um ator. Isso é semelhante à filosofia de tudo é um objeto usada por algumas linguagens de programação orientada a objetos, mas difere no fato de que o software orientado a objetos geralmente é executado sequencialmente, enquanto o modelo Actor é inerentemente simultâneo. Um ator é uma entidade computacional que, em resposta a uma mensagem que recebe, pode simultaneamente: enviar um número finito de mensagens para outros atores; criar um número finito de novos atores; designar o comportamento a ser usado para a próxima mensagem que receber. Não existe uma sequência assumida para as ações acima e elas podem ser executadas em paralelo. A dissociação do remetente das comunicações enviadas foi um avanço fundamental do modelo do ator, permitindo estruturas de comunicação e controle assíncronas como padrões de transmissão de mensagens.