Der Kern von Elixir: sehr viele leichtgewichtige Prozesse (keine Betriebssystem-Threads), die über Nachrichten kommunizieren und keinen Speicher teilen. Mit spawn startest du einen Prozess, mit send schickst du eine Nachricht, mit receive wartest du darauf. Höhere Bausteine sind Task (eine Aufgabe nebenher), Agent (Zustand) und GenServer (Server-Prozess).
Ein Supervisor überwacht Prozesse und startet sie bei Fehlern neu. Das Web-Framework Phoenix baut auf diesen Ideen auf.
parent = self()
spawn(fn -> send(parent, {:ergebnis, 21 * 2}) end)
receive do
{:ergebnis, wert} -> IO.puts("Antwort: #{wert}")
after
1000 -> IO.puts("Zeit abgelaufen")
end
task = Task.async(fn -> Enum.sum(1..100) end)
IO.puts(Task.await(task)) # 5050Merke
- Prozesse sind leicht und teilen keinen Speicher
sendundreceivetauschen Nachrichten aus- Supervisoren starten abgestürzte Prozesse neu
Aufgabe
Starte drei Tasks, die je eine Zahl berechnen, und addiere die Ergebnisse.