Clause
← Toute la documentation

Traduit de l'original anglais · 06042fa · 2026-10-09 · Lire en anglais

Processus

Plan 11 step 43 (2026-10-08) : processus créés par spawn sur un exécuteur coopératif ; step 44 : raisons de sortie et rapports d'erreur ; step 45 : envoi de messages ; step 46 : réception sélective ; step 47 : délais d'attente de réception ; step 48 : liens et signaux de sortie ; step 49 : moniteurs ; step 50 : noms enregistrés ; step 53 : ports (aucun) ; step 56 : workers de l'ordonnanceur ; step 57 : réveils entre workers et arrêt.

Exécuteur

Un runtime exécute ses processus sur ses workers d'ordonnanceur (workers, modèle d'exécution). Le démarrage fait de l'appel de la fonction d'entrée le premier processus, le processus principal, et exécute l'exécuteur jusqu'à ce qu'il se termine :

Workers

Plan step 56 (2026-10-08). L'exécuteur exécute les processus sur RuntimeOptions::schedulers threads workers : le thread qui a démarré le programme et un thread de plus par worker supplémentaire. Les programmes prennent ce nombre dans --schedulers N (1 à 1 024, options du runtime) ; par défaut, un worker par processeur logique, comme +S d'OTP.

Les réveils et l'arrêt (plan step 57) ne nécessitent aucun mécanisme supplémentaire, car tout changement de l'état d'ordonnancement d'un processus se fait sous le mutex de l'exécuteur :

Sorties

Un processus autre que le principal se termine avec une raison de sortie, comme dans OTP (detail::exit_reason, process/exits). Les signaux de sortie la transmettent aux processus liés (liens) et les messages 'DOWN' aux processus qui le surveillent (moniteurs) ; les rapports d'erreur l'affichent.

Comment le processus se termineRaison de sortieRapport d'erreur
Son premier appel retournenormalAucun
exit(Reason) (y compris normal, kill)ReasonAucun
Une erreur (error/1,2,3, badarith, {badmatch, V}, undef, ...){Reason, Stack}Oui
Un throw(Value) non capturé{{nocatch, Value}, Stack}Oui
Un signal de sortie le termine (signaux de sortie)La raison du signal, killed pour exit(Pid, kill)Aucun

Un rapport d'erreur est écrit sur stderr lorsque le processus se termine, après le vidage de la sortie standard, au format du gestionnaire de journalisation (logger handler) par défaut d'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,[]}]}

L'en-tête contient l'heure locale ; la raison est mise en page comme le fait ~p. Le processus principal n'en écrit pas : son exception non capturée est celle du programme (exécutables).

Messages

Dest ! Msg et erlang:send(Dest, Msg) (plan step 45) évaluent d'abord Dest et renvoient Msg.

DestEffet
Un pid d'un processus vivantMsg est copié dans le tas du destinataire (copie entre tas), en conservant son partage, et ajouté à sa boîte de réception des signaux
Un pid d'un processus terminéRien ; l'envoi réussit
Un nom enregistréComme pour son pid ; badarg lorsqu'aucun processus vivant ne porte ce nom
{Name, nonode@nohost} de deux atomesComme pour le pid enregistré sous Name ; rien s'il n'y en a pas
{Name, Node} pour tout autre nœudRien (il n'y a pas d'autres nœuds)
Toute autre chosebadarg

Réception

receive (plan steps 46–47) choisit parmi ses clauses comme case, sur les messages de la boîte aux lettres :

Plan step 48. Un lien relie deux processus dans les deux sens (Signals dans chaque contexte : les pids liés dans l'ordre des liens et l'indicateur trap_exit).

Moniteurs

Plan step 49. Un moniteur est unidirectionnel : le processus qui surveille le détient (par référence, dans Signals) et le processus surveillé garde la référence et le pid de l'observateur, afin de pouvoir envoyer le message lorsqu'il se termine.

Noms enregistrés

Plan step 50. L'exécuteur garde une table unique associant des noms (atomes) à des pids, et chaque processus son propre nom (Signals::name).

Signaux de sortie

Tout signal de sortie provient d'un processus en cours d'exécution (exit/2, exit_signal/2, link/1) ou de la fin d'un processus. L'exécuteur le traite immédiatement lorsque sa cible ne s'exécute pas sur un autre worker, sinon une fois la tranche de la cible terminée (workers, scheduler/signals) : une cible terminée quitte la file d'exécution ou son attente et est finalisée (ses liens reçoivent le signal, son rapport d'erreur est écrit, son contexte libéré) avant que le builtin émetteur ne retourne. Une longue chaîne de liens se termine processus par processus, sans récursion.

Signal reçu par un processusNe piège pas les sortiesPiège les sorties
exit(Pid, kill), exit_signal(Pid, kill)Se termine avec la raison killedSe termine avec la raison killed
Raison normal (depuis un lien, ou envoyée à un autre processus)RienMessage {'EXIT', From, normal}
exit(self(), normal)Se termine avec la raison normal (bizarrerie d'OTP)Message {'EXIT', Self, normal}
exit_signal(self(), normal)RienMessage {'EXIT', Self, normal}
Toute autre raison, y compris kill depuis un lienSe termine avec cette raisonMessage {'EXIT', From, Reason}

Ports

Les ports (plan steps 57A–57F) sont spécifiés dans ports : un port est lié au processus qui l'a ouvert, participe aux liens, moniteurs, signaux de sortie et noms enregistrés comme un processus, et communique avec son processus connecté par des messages. Le step 57B fournit les identités, la table des ports, les builtins de ports et les ports {fd, In, Out} en sortie seule.

Builtins

BuiltinComportement
spawn(Fun)badarg sauf si Fun est un fun ; sinon un nouveau processus appelle Fun(), levant {badarity, {Fun, []}} dans ce processus pour une autre arité
spawn(M, F, Args)badarg sauf si M et F sont des atomes et Args une liste propre ; sinon un nouveau processus appelle M:F(Args...), levant undef dans ce processus lorsqu'aucun module ne l'exporte et qu'aucun builtin ne porte ce nom
spawn_link(Fun), spawn_link(M, F, Args)Comme spawn, et le nouveau processus est lié à l'appelant (liens)
is_process_alive(Pid)badarg sauf si Pid est un pid ; true tant que son processus ne s'est pas terminé
spawn_monitor(Fun), spawn_monitor(M, F, Args)Comme spawn, en renvoyant {Pid, Ref} d'un nouveau moniteur
link(Pid), unlink(Pid)badarg sauf si Pid est un pid (liens)
monitor(process, Item)badarg pour un autre type ou élément ; une référence (moniteurs) ; Item est un pid ou un nom enregistré
register(Name, Pid), unregister(Name), whereis(Name), registered()Voir noms enregistrés ; Name doit être un atome
demonitor(Ref), demonitor(Ref, Options)badarg sauf si Ref est une référence et Options une liste propre de flush et info
exit(Dest, Reason), exit_signal(Dest, Reason)badarg sauf si Dest est un pid ou une référence ; true après le signal de sortie
process_flag(trap_exit, Bool)Le réglage précédent ; badarg pour un autre indicateur ou une valeur non booléenne
erlang:send(Dest, Msg), Dest ! MsgMsg, après l'avoir envoyé (messages) ; send/2 n'est pas auto-importé

Le nouveau processus est mis en file derrière tous les processus exécutables ; spawn renvoie immédiatement son pid.