Du hast sicher schon mal den Begriff Event Loop gehört – häufig im Zusammenhang mit JavaScript oder Node.js. Aber was steckt wirklich dahinter? Kurz gesagt: Der Event Loop ist die Engine, die dafür sorgt, dass dein Code nicht blockiert, sondern weiterlaufen kann, während er auf Ereignisse wartet.
Stell dir vor, du sitzt an einem Schalter, der mehrere Anrufe entgegennimmt. Jeder Anruf ist ein Event (z. B. ein Mausklick, ein Netzwerk‑Response oder ein Timer). Der Event Loop ist der Schalter‑Mitarbeiter: Er nimmt das nächste Ereignis aus der Warteschlange, führt den zugehörigen Callback aus und geht dann zurück zur Warteschlange. Wichtig dabei: Solange ein Callback läuft, wird nichts anderes verarbeitet – das nennt man die single‑threaded Natur von JavaScript.
In Python funktioniert das ähnlich, wenn du asyncio
nutzt. Dort gibt es ebenfalls eine Ereignisschleife, die await
-Aufrufe paust und die Kontrolle zurück zum Loop gibt, sodass andere Tasks weiterlaufen können.
Ein typisches Node.js‑Beispiel ist das Lesen einer Datei:
const fs = require('fs');
fs.readFile('data.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});
console.log('Ich komme sofort weiter');
Der zweite console.log
wird sofort ausgeführt, weil das Dateisystem‑Event in die Queue geschoben wird und erst später vom Loop abgearbeitet wird. Ohne Event Loop würde das Programm erst warten, bis die Datei gelesen ist.
In Python sieht das so aus:
import asyncio
async def read_file():
data = await asyncio.to_thread(open, 'data.txt')
print(data)
async def main():
asyncio.create_task(read_file())
print('Ich komme sofort weiter')
await asyncio.sleep(1)
asyncio.run(main())
Auch hier wird die Ausgabe "Ich komme sofort weiter" zuerst gezeigt, weil das Lesen der Datei in den Hintergrund verschoben wird.
Der Event Loop ist nicht nur für I/O wichtig. Timers, UI‑Events im Browser und sogar das Aufrufen von setTimeout
nutzen die gleiche Schleife. Wenn du viele kleine Tasks hast, kann das zu einem sogenannten Event‑Loop‑Starvation führen – das bedeutet, dass der Loop zu lange mit einem Task beschäftigt ist und andere Events zu spät bekommen. Um das zu vermeiden, solltest du lange Rechenaufgaben in Web‑Workers oder separate Prozesse auslagern.
Ein weiterer praktischer Tipp: In Node.js kannst du mit process.nextTick
oder setImmediate
bestimmen, wann ein Callback genau ausgeführt wird. nextTick
kommt sofort nach dem aktuellen Callback, während setImmediate
erst nach dem kompletten Durchlauf der Queue wartet.
Zusammengefasst: Der Event Loop ist das Bindeglied zwischen deinem Code und den asynchronen Ereignissen. Er ermöglicht reaktive Anwendungen, die schnell auf Eingaben reagieren, ohne zu blockieren. Egal, ob du JavaScript im Browser, Node.js auf dem Server oder Python mit asyncio
nutzt – das Prinzip bleibt das gleiche.
Jetzt bist du bereit, den Event Loop bewusst einzusetzen: Nutze asynchrone APIs, vermeide lange Blocking‑Aufgaben und strukturiere deinen Code in kleine, wiederverwendbare Callbacks. So bekommst du performante und wartbare Anwendungen, die auch unter Last stabil bleiben.
Was ist am schwersten in JavaScript? Die Antwort: Asynchronität und der Event Loop. Verständlich erklärt, mit Beispielen, Checklisten, FAQ und Troubleshooting.
© 2025. Alle Rechte vorbehalten.