Event Loop – So funktioniert asynchrones Arbeiten in JavaScript, Python & Node.js

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.

Was ist ein Event Loop?

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.

Event Loop in Praxis: Beispiele

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.

25

Aug

2025

Das Schwierigste an JavaScript: Event Loop & Asynchronität meistern (mit Beispielen)

Das Schwierigste an JavaScript: Event Loop & Asynchronität meistern (mit Beispielen)

Was ist am schwersten in JavaScript? Die Antwort: Asynchronität und der Event Loop. Verständlich erklärt, mit Beispielen, Checklisten, FAQ und Troubleshooting.