Clause
← Toda la documentación

Traducido del original en inglés · 06042fa · 2026-10-09 · Leer en inglés

Procesos

Plan 11 step 43 (2026-10-08): procesos lanzados (spawn) sobre un ejecutor cooperativo; step 44: razones de salida e informes de error; step 45: envío de mensajes; step 46: receive selectivo; step 47: tiempos de espera de receive; step 48: enlaces (links) y señales de salida; step 49: monitores; step 50: nombres registrados; step 53: puertos (ninguno); step 56: workers del planificador; step 57: despertares entre workers y apagado.

Ejecutor

Un runtime ejecuta sus procesos en sus workers del planificador (workers, modelo de ejecución). El arranque convierte la llamada a la función de entrada en el primer proceso, el proceso principal, y ejecuta el ejecutor hasta que este termina:

Workers

Plan step 56 (2026-10-08). El ejecutor ejecuta los procesos en RuntimeOptions::schedulers hilos worker: el hilo que arrancó el programa y un hilo más por cada worker adicional. Los programas toman el número de --schedulers N (de 1 a 1.024, opciones del runtime); por defecto hay un worker por procesador lógico, como +S de OTP.

Los despertares y el apagado (plan step 57) no necesitan ningún mecanismo adicional, porque todo cambio del estado de planificación de un proceso ocurre bajo el mutex del ejecutor:

Salidas

Un proceso distinto del principal termina con una razón de salida, como en OTP (detail::exit_reason, process/exits). Las señales de salida la llevan a los procesos enlazados (enlaces) y los mensajes 'DOWN' a los que lo monitorizan (monitores); los informes de error la muestran.

Cómo termina el procesoRazón de salidaInforme de error
Su primera llamada retornanormalNinguno
exit(Reason) (también normal, kill)ReasonNinguno
Un error (error/1,2,3, badarith, {badmatch, V}, undef, ...){Reason, Stack}Sí
Un throw(Value) no capturado{{nocatch, Value}, Stack}Sí
Lo termina una señal de salida (señales de salida)La razón de la señal, killed para exit(Pid, kill)Ninguno

Un informe de error se escribe en stderr cuando el proceso termina, después de vaciar la salida estándar, con el formato del manejador de logger por defecto de 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,[]}]}

La cabecera lleva la hora local; la razón se presenta como lo hace ~p. El proceso principal no escribe ninguno: su excepción no capturada es la del programa (ejecutables).

Mensajes

Dest ! Msg y erlang:send(Dest, Msg) (plan step 45) evalúan primero Dest y devuelven Msg.

DestEfecto
El pid de un proceso vivoMsg se copia en el heap del receptor (copia entre heaps), conservando su compartición, y se añade a su buzón de señales
El pid de un proceso que ha terminadoNada; el envío tiene éxito
Un nombre registradoComo para su pid; badarg cuando ningún proceso vivo tiene ese nombre
{Name, nonode@nohost} de dos átomosComo para el pid registrado como Name; nada si no hay ninguno
{Name, Node} para cualquier otro nodoNada (no hay otros nodos)
Cualquier otra cosabadarg

Receive

receive (plan steps 46–47) selecciona entre sus cláusulas como case, sobre los mensajes del buzón:

Plan step 48. Un enlace conecta dos procesos en ambos sentidos (Signals en cada contexto: los pids enlazados en el orden de enlace y el indicador trap_exit).

Monitores

Plan step 49. Un monitor es unidireccional: el proceso que monitoriza lo mantiene (por referencia, en Signals) y el proceso monitorizado guarda la referencia y el pid del que monitoriza, para poder enviar el mensaje cuando termine.

Nombres registrados

Plan step 50. El ejecutor mantiene una tabla de nombres (átomos) a pids, y cada proceso su propio nombre (Signals::name).

Señales de salida

Toda señal de salida procede de un proceso en ejecución (exit/2, exit_signal/2, link/1) o del final de un proceso. El ejecutor actúa sobre ella de inmediato cuando su destino no se ejecuta en otro worker, y si no, en cuanto termina la porción del destino (workers, scheduler/signals): un destino terminado sale de la cola de ejecución o de su espera y se finaliza (señales a sus enlaces, su informe de error escrito, su contexto liberado) antes de que retorne el builtin emisor. Una cadena larga de enlaces termina proceso a proceso sin recursión.

Señal en un procesoSin atrapar salidasAtrapando salidas
exit(Pid, kill), exit_signal(Pid, kill)Termina con la razón killedTermina con la razón killed
Razón normal (de un enlace, o enviada a otro proceso)NadaMensaje {'EXIT', From, normal}
exit(self(), normal)Termina con la razón normal (peculiaridad de OTP)Mensaje {'EXIT', Self, normal}
exit_signal(self(), normal)NadaMensaje {'EXIT', Self, normal}
Cualquier otra razón, incluido kill de un enlaceTermina con esa razónMensaje {'EXIT', From, Reason}

Puertos

Los puertos (plan steps 57A–57F) se especifican en puertos: un puerto está enlazado con quien lo abre, participa en enlaces, monitores, señales de salida y nombres registrados como un proceso, y se comunica con su proceso conectado mediante mensajes. El step 57B proporciona las identidades, la tabla de puertos, los builtins de puertos y los puertos {fd, In, Out} de solo salida.

Builtins

BuiltinComportamiento
spawn(Fun)badarg salvo que Fun sea un fun; si lo es, un proceso nuevo llama a Fun(), lanzando {badarity, {Fun, []}} en ese proceso si la aridad es otra
spawn(M, F, Args)badarg salvo que M y F sean átomos y Args una lista propia; si no, un proceso nuevo llama a M:F(Args...), lanzando undef en ese proceso cuando ningún módulo la exporta y ningún builtin tiene ese nombre
spawn_link(Fun), spawn_link(M, F, Args)Como spawn, y el proceso nuevo queda enlazado con el llamante (enlaces)
is_process_alive(Pid)badarg salvo que Pid sea un pid; true mientras su proceso no haya terminado
spawn_monitor(Fun), spawn_monitor(M, F, Args)Como spawn, devolviendo {Pid, Ref} de un nuevo monitor
link(Pid), unlink(Pid)badarg salvo que Pid sea un pid (enlaces)
monitor(process, Item)badarg para otro tipo u otro elemento; una referencia (monitores); Item es un pid o un nombre registrado
register(Name, Pid), unregister(Name), whereis(Name), registered()Véase nombres registrados; Name debe ser un átomo
demonitor(Ref), demonitor(Ref, Options)badarg salvo que Ref sea una referencia y Options una lista propia de flush e info
exit(Dest, Reason), exit_signal(Dest, Reason)badarg salvo que Dest sea un pid o una referencia; true tras la señal de salida
process_flag(trap_exit, Bool)El valor anterior; badarg para otro indicador o un valor no booleano
erlang:send(Dest, Msg), Dest ! MsgMsg, después de enviarlo (mensajes); send/2 no se importa automáticamente

El proceso nuevo se encola detrás de todos los procesos ejecutables; spawn devuelve su pid de inmediato.