Clause
← Toda a documentação

Traduzido do original em inglês · 06042fa · 2026-10-09 · Ler em inglês

Processos

Plano 11, step 43 (2026-10-08): processos lançados (spawn) num executor cooperativo; step 44: razões de saída e relatórios de erro; step 45: envio de mensagens; step 46: receive seletivo; step 47: timeouts de receive; step 48: ligações (links) e sinais de saída; step 49: monitores; step 50: nomes registados; step 53: portas (nenhuma); step 56: workers do escalonador; step 57: despertares entre workers e encerramento.

Executor

Um runtime executa os seus processos nos seus workers do escalonador (workers, modelo de execução). O arranque faz da chamada da função de entrada o primeiro processo, o processo principal, e executa o executor até este terminar:

Workers

Step 56 do plano (2026-10-08). O executor executa processos em RuntimeOptions::schedulers threads de trabalho (worker threads): a thread que iniciou o programa e mais uma thread por cada worker adicional. Os programas obtêm o número a partir de --schedulers N (de 1 a 1024, opções do runtime); por omissão, um worker por processador lógico, como o +S do OTP.

Os despertares e o encerramento (step 57 do plano) não precisam de mais nenhum mecanismo, porque todas as mudanças do estado de escalonamento de um processo acontecem sob o mutex do executor:

Saídas

Um processo que não seja o principal termina com uma razão de saída, como no OTP (detail::exit_reason, process/exits). Os sinais de saída levam-na aos processos ligados (ligações) e as mensagens 'DOWN' aos que o monitorizam (monitores); os relatórios de erro mostram-na.

Como o processo terminaRazão de saídaRelatório de erro
A sua primeira chamada retornanormalNenhum
exit(Reason) (também normal, kill)ReasonNenhum
Um erro (error/1,2,3, badarith, {badmatch, V}, undef, ...){Reason, Stack}Sim
Um throw(Value) não capturado{{nocatch, Value}, Stack}Sim
Um sinal de saída termina-o (sinais de saída)A razão do sinal, killed para exit(Pid, kill)Nenhum

Um relatório de erro é escrito no stderr quando o processo termina, depois de esvaziar a saída padrão, no formato do handler de logger por omissão do OTP:

=ERROR REPORT==== 8-Oct-2026::03:42:15.983000 ===
Error in process <0.8.0> with exit value:
{boom,[{crash_reports,'-main/1-fun-6-',0,[]}]}

O cabeçalho tem a hora local; a razão é disposta como faz ~p. O processo principal não escreve nenhum: a sua exceção não capturada é a do programa (executáveis).

Mensagens

Dest ! Msg e erlang:send(Dest, Msg) (step 45 do plano) avaliam primeiro Dest e devolvem Msg.

DestEfeito
Um pid de um processo vivoMsg é copiada para o heap do recetor (cópia entre heaps), mantendo a sua partilha, e acrescentada à sua caixa de entrada de sinais
Um pid de um processo que terminouNada; o envio tem sucesso
Um nome registadoComo para o seu pid; badarg quando nenhum processo vivo tem o nome
{Name, nonode@nohost} de dois átomosComo para o pid registado como Name; nada quando não existe nenhum
{Name, Node} para qualquer outro nóNada (não existem outros nós)
Qualquer outra coisabadarg

Receive

receive (steps 46–47 do plano) seleciona entre as suas cláusulas como case, sobre as mensagens da caixa de correio:

Step 48 do plano. Uma ligação (link) liga dois processos nos dois sentidos (Signals em cada contexto: os pids ligados por ordem de ligação e o indicador trap_exit).

Monitores

Step 49 do plano. Um monitor é unidirecional: o processo que monitoriza detém-no (por referência, em Signals) e o processo monitorizado guarda a referência e o pid do monitorizador, para poder enviar a mensagem quando terminar.

Nomes registados

Step 50 do plano. O executor mantém uma tabela de nomes (átomos) para pids, e cada processo o seu próprio nome (Signals::name).

Sinais de saída

Cada sinal de saída provém de um processo em execução (exit/2, exit_signal/2, link/1) ou do fim de um processo. O executor atua sobre ele de imediato quando o seu destino não está a correr noutro worker, caso contrário quando a fatia do destino tiver terminado (workers, scheduler/signals): um destino terminado sai da fila de execução ou da sua espera e é finalizado (as suas ligações sinalizadas, o seu relatório de erro escrito, o seu contexto libertado) antes de o builtin que enviou retornar. Uma cadeia longa de ligações termina processo a processo, sem recursão.

Sinal num processoSem capturar saídasA capturar saídas
exit(Pid, kill), exit_signal(Pid, kill)Termina com a razão killedTermina com a razão killed
Razão normal (de uma ligação, ou enviada a outro processo)NadaMensagem {'EXIT', From, normal}
exit(self(), normal)Termina com a razão normal (peculiaridade do OTP)Mensagem {'EXIT', Self, normal}
exit_signal(self(), normal)NadaMensagem {'EXIT', Self, normal}
Qualquer outra razão, incluindo kill de uma ligaçãoTermina com essa razãoMensagem {'EXIT', From, Reason}

Portas

As portas (steps 57A–57F do plano) estão especificadas em portas: uma porta está ligada a quem a abriu, participa em ligações, monitores, sinais de saída e nomes registados como um processo, e comunica com o seu processo conectado através de mensagens. O step 57B fornece as identidades, a tabela de portas, os builtins de portas e as portas {fd, In, Out} só de saída.

Builtins

BuiltinComportamento
spawn(Fun)badarg a menos que Fun seja um fun; caso contrário, um novo processo chama Fun(), lançando {badarity, {Fun, []}} nesse processo para outra aridade
spawn(M, F, Args)badarg a menos que M e F sejam átomos e Args uma lista própria; caso contrário, um novo processo chama M:F(Args...), lançando undef nesse processo quando nenhum módulo a exporta e nenhum builtin tem esse nome
spawn_link(Fun), spawn_link(M, F, Args)Como spawn, e o novo processo é ligado ao chamador (ligações)
is_process_alive(Pid)badarg a menos que Pid seja um pid; true enquanto o seu processo não tiver terminado
spawn_monitor(Fun), spawn_monitor(M, F, Args)Como spawn, devolvendo {Pid, Ref} de um novo monitor
link(Pid), unlink(Pid)badarg a menos que Pid seja um pid (ligações)
monitor(process, Item)badarg para outro tipo ou item; uma referência (monitores); Item é um pid ou um nome registado
register(Name, Pid), unregister(Name), whereis(Name), registered()Ver nomes registados; Name tem de ser um átomo
demonitor(Ref), demonitor(Ref, Options)badarg a menos que Ref seja uma referência e Options uma lista própria de flush e info
exit(Dest, Reason), exit_signal(Dest, Reason)badarg a menos que Dest seja um pid ou uma referência; true depois do sinal de saída
process_flag(trap_exit, Bool)A definição anterior; badarg para outro indicador ou um não booleano
erlang:send(Dest, Msg), Dest ! MsgMsg, depois de a enviar (mensagens); send/2 não é importado automaticamente

O novo processo é colocado na fila atrás de todos os processos executáveis; spawn devolve o seu pid de imediato.