EMZETT.
Login

Event Loop (Ereignisschleife)

Kurz: Die Event Loop ist eine Schleife, die auf Ereignisse wartet (Klick, Netzwerkantwort, Timer, fertig gelesene Datei) und die dazu registrierten Funktionen nacheinander ausführt – in einem einzigen Thread.

Genauer: Sie ist das Herz von JavaScript im Browser und in Node.js, aber auch von Python (asyncio), Tcl, Qt/GTK-Oberflächen und Spielen. Langsame Operationen laufen nicht im Vordergrund; stattdessen meldet das Betriebssystem ihre Fertigstellung, und die Schleife ruft den passenden Callback auf.

Event Loop mit Stack und Queues

Im Detail

Prinzip

solange das Programm läuft:
    nimm das nächste Ereignis aus der Warteschlange
    führe die zugehörige Funktion bis zum Ende aus
    (wenn nichts zu tun ist: auf neue Ereignisse warten)

JavaScript

console.log("1 Start");
setTimeout(() => console.log("3 Timer (Macrotask)"), 0);
Promise.resolve().then(() => console.log("2b Microtask"));
console.log("2 Ende des Skripts");
// Ausgabe: 1 Start, 2 Ende des Skripts, 2b Microtask, 3 Timer (Macrotask)

Zuerst läuft der aktuelle Code zu Ende, dann alle Microtasks (Promises, await), dann der nächste Macrotask (Timer, Ereignisse). Daran erkennt man, dass setTimeout(..., 0) nicht „sofort“ bedeutet.

Grundregel: nie blockieren

Da nur ein Thread die Schleife bedient, friert die ganze Anwendung ein, wenn eine Funktion lange rechnet: Die Seite reagiert nicht mehr auf Klicks. Lange Berechnungen lagert man in Web Worker, Worker-Threads oder eigene Prozesse aus (Threads).

while (true) {}           // blockiert die Event Loop für immer: Seite hängt

Zusammen mit async/await entsteht der übliche Stil moderner Webserver und Oberflächen: viele gleichzeitige Verbindungen auf einem Thread (Node.js, Nginx, Netty). Eine Event Loop in Tcl ist im Kurs Tcl gezeigt (after, vwait).

Siehe auch: async/await, Callback, Nebenläufigkeit, Thread