Clause
← Gesamte Dokumentation

Übersetzt aus dem englischen Original · 06042fa · 2026-10-09 · Auf Englisch lesen

Prozesse

Plan 11, step 43 (2026-10-08): gestartete Prozesse auf einem kooperativen Executor; step 44: Exit-Gründe und Fehlerberichte; step 45: Senden von Nachrichten; step 46: selektives Empfangen; step 47: Empfangs-Timeouts; step 48: Links und Exit-Signale; step 49: Monitore; step 50: registrierte Namen; step 53: Ports (keine); step 56: Scheduler-Worker; step 57: Aufwecken über Worker hinweg und Herunterfahren.

Executor

Eine Runtime führt ihre Prozesse auf ihren Scheduler-Workern aus (Worker, Ausführungsmodell). Beim Start wird der Aufruf der Einstiegsfunktion zum ersten Prozess, dem Hauptprozess, und der Executor läuft, bis dieser endet:

Worker

Plan-Step 56 (2026-10-08). Der Executor führt Prozesse auf RuntimeOptions::schedulers Worker-Threads aus: dem Thread, der das Programm gestartet hat, und je einem weiteren Thread pro zusätzlichem Worker. Programme übernehmen die Anzahl aus --schedulers N (1 bis 1.024, Runtime-Optionen); Standard ist ein Worker pro logischem Prozessor, wie bei +S von OTP.

Aufwecken und Herunterfahren (Plan-Step 57) brauchen keinen weiteren Mechanismus, weil jede Änderung am Scheduling-Zustand eines Prozesses unter dem Executor-Mutex geschieht:

Exits

Ein Prozess außer dem Hauptprozess endet mit einem Exit-Grund, wie in OTP (detail::exit_reason, process/exits). Exit-Signale tragen ihn zu verlinkten Prozessen (Links) und 'DOWN'-Nachrichten zu überwachenden (Monitore); Fehlerberichte zeigen ihn.

Wie der Prozess endetExit-GrundFehlerbericht
Sein erster Aufruf kehrt zurücknormalKeiner
exit(Reason) (auch normal, kill)ReasonKeiner
Ein Fehler (error/1,2,3, badarith, {badmatch, V}, undef, ...){Reason, Stack}Ja
Ein nicht abgefangenes throw(Value){{nocatch, Value}, Stack}Ja
Ein Exit-Signal beendet ihn (Exit-Signale)Der Grund des Signals, killed für exit(Pid, kill)Keiner

Ein Fehlerbericht wird auf stderr geschrieben, wenn der Prozess endet, nach dem Leeren der Standardausgabe, im Format des Standard-Logger-Handlers von 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,[]}]}

Der Kopf enthält die Ortszeit; der Grund wird so gesetzt, wie ~p es tut. Der Hauptprozess schreibt keinen: Seine nicht abgefangene Ausnahme ist die des Programms (ausführbare Dateien).

Nachrichten

Dest ! Msg und erlang:send(Dest, Msg) (Plan-Step 45) werten zuerst Dest aus und geben Msg zurück.

DestWirkung
Eine Pid eines lebenden ProzessesMsg wird in den Heap des Empfängers kopiert (Kopieren zwischen Heaps), unter Erhalt seiner gemeinsamen Teile, und an seinen Signal-Eingang angehängt
Eine Pid eines beendeten ProzessesNichts; die Sendung gelingt
Ein registrierter NameWie für seine Pid; badarg, wenn kein lebender Prozess den Namen hat
{Name, nonode@nohost} aus zwei AtomenWie für die als Name registrierte Pid; nichts, wenn es keine gibt
{Name, Node} für jeden anderen KnotenNichts (es gibt keine anderen Knoten)
Alles anderebadarg

Receive

receive (Plan-Steps 46–47) wählt wie case unter seinen Klauseln aus, über die Nachrichten der Mailbox:

Plan-Step 48. Ein Link verbindet zwei Prozesse in beide Richtungen (Signals in jedem Kontext: die verlinkten Pids in Link-Reihenfolge und das Flag trap_exit).

Monitore

Plan-Step 49. Ein Monitor ist einseitig: Der überwachende Prozess hält ihn (per Referenz, in Signals), und der überwachte Prozess bewahrt die Referenz und die überwachende Pid, damit er die Nachricht senden kann, wenn er endet.

Registrierte Namen

Plan-Step 50. Der Executor führt eine Tabelle von Namen (Atomen) zu Pids, und jeder Prozess seinen eigenen Namen (Signals::name).

Exit-Signale

Jedes Exit-Signal kommt von einem laufenden Prozess (exit/2, exit_signal/2, link/1) oder vom Ende eines Prozesses. Der Executor verarbeitet es sofort, wenn sein Ziel nicht auf einem anderen Worker läuft, sonst sobald die Zeitscheibe des Ziels geendet hat (Worker, scheduler/signals): Ein beendetes Ziel verlässt die Run-Queue oder sein Warten und wird abgeschlossen (seine Links signalisiert, sein Fehlerbericht geschrieben, sein Kontext freigegeben), bevor das sendende Builtin zurückkehrt. Eine lange verlinkte Kette endet Prozess für Prozess ohne Rekursion.

Signal an einem ProzessFängt Exits nicht abFängt Exits ab
exit(Pid, kill), exit_signal(Pid, kill)Endet mit Grund killedEndet mit Grund killed
Grund normal (von einem Link oder an einen anderen Prozess gesendet)NichtsNachricht {'EXIT', From, normal}
exit(self(), normal)Endet mit Grund normal (Eigenheit von OTP)Nachricht {'EXIT', Self, normal}
exit_signal(self(), normal)NichtsNachricht {'EXIT', Self, normal}
Jeder andere Grund, einschließlich kill von einem LinkEndet mit diesem GrundNachricht {'EXIT', From, Reason}

Ports

Ports (Plan-Steps 57A–57F) sind in Ports spezifiziert: Ein Port ist mit seinem Öffner verlinkt, nimmt wie ein Prozess an Links, Monitoren, Exit-Signalen und registrierten Namen teil und spricht mit seinem verbundenen Prozess über Nachrichten. Step 57B stellt Identitäten, die Port-Tabelle, die Port-Builtins und reine Ausgabe-Ports {fd, In, Out} bereit.

Builtins

BuiltinVerhalten
spawn(Fun)badarg, außer Fun ist ein fun; sonst ruft ein neuer Prozess Fun() auf und löst in diesem Prozess bei anderer Stelligkeit {badarity, {Fun, []}} aus
spawn(M, F, Args)badarg, außer M und F sind Atome und Args eine echte Liste; sonst ruft ein neuer Prozess M:F(Args...) auf und löst in diesem Prozess undef aus, wenn kein Modul sie exportiert und kein Builtin diesen Namen hat
spawn_link(Fun), spawn_link(M, F, Args)Wie spawn, und der neue Prozess wird mit dem Aufrufer verlinkt (Links)
is_process_alive(Pid)badarg, außer Pid ist eine Pid; wahr, solange ihr Prozess nicht geendet hat
spawn_monitor(Fun), spawn_monitor(M, F, Args)Wie spawn, gibt {Pid, Ref} eines neuen Monitors zurück
link(Pid), unlink(Pid)badarg, außer Pid ist eine Pid (Links)
monitor(process, Item)badarg für einen anderen Typ oder ein anderes Element; eine Referenz (Monitore); Item ist eine Pid oder ein registrierter Name
register(Name, Pid), unregister(Name), whereis(Name), registered()Siehe registrierte Namen; Name muss ein Atom sein
demonitor(Ref), demonitor(Ref, Options)badarg, außer Ref ist eine Referenz und Options eine echte Liste aus flush und info
exit(Dest, Reason), exit_signal(Dest, Reason)badarg, außer Dest ist eine Pid oder Referenz; true nach dem Exit-Signal
process_flag(trap_exit, Bool)Die vorherige Einstellung; badarg für ein anderes Flag oder einen Nicht-Boolean
erlang:send(Dest, Msg), Dest ! MsgMsg, nach dem Senden (Nachrichten); send/2 wird nicht automatisch importiert

Der neue Prozess wird hinter jedem lauffähigen Prozess eingereiht; spawn gibt seine Pid sofort zurück.