Erklärte JavaScript-Ereignisschleife: Aufrufstapel, Mikrotasks und Timer mit Beispielen
Warum läuft ein setTimeout von Null immer noch zuletzt? Wie kann ein Thread so viel auf einmal verarbeiten? Erfahren Sie, wie die Ereignisschleife wirklich funktioniert, testen Sie sie mit dem von uns ausgeführten Code und lösen Sie die klassische Interviewfrage.
- JavaScript führt Ihren Code Stück für Stück in einem einzelnen Thread aus.
- Wenn der Aufrufstapel leer ist, werden zuerst alle Mikrotasks ausgeführt und dann eine Aufgabe.
setTimeout(fn, 0)bedeutet „so bald wie möglich nach einer Mindestverzögerung“, nicht „jetzt“.- Lange synchrone Arbeit blockiert alles, also teilen Sie es auf oder verschieben Sie es auf einen Worker.
Führen Sie ein paar Zeilen mit setTimeout und einem Versprechen aus, und die Ausgabereihenfolge wird Sie vielleicht überraschen. Die JavaScript-Ereignisschleife erklärt warum. Es ist der Mechanismus, der es einer Single-Threaded-Sprache ermöglicht, Timer, Netzwerkaufrufe und Klicks ohne Einfrieren zu verarbeiten.
Sobald man es verstanden hat, beginnt eine ganze Klasse verwirrender Fehler einen Sinn zu ergeben. Wir haben jedes Beispiel auf Node.js 24 ausgeführt und die Ausgabe stammt von diesem Lauf. Die grundlegenden Bestellregeln gelten auch in Browsern, und wir weisen darauf hin, wo sich Node.js unterscheidet. Sie werden mehr davon haben, wenn Sie bereits die Grundlagen von JavaScript-Versprechen kennen.
Warum die Ereignisschleife existiert
JavaScript führt Ihren Code in einem Hauptthread aus, sodass jeweils nur ein Teil davon ausgeführt wird. Wenn einfach auf eine Netzwerkanfrage gewartet würde, würde eine Seite einfrieren, bis die Antwort zurückkäme.
JavaScript wartet also nicht. Langsame Arbeit wird an die Host-Umgebung übergeben, also an den Browser oder Node.js, die sie im Hintergrund erledigen können. Wenn diese Arbeit abgeschlossen ist, wird ein Rückruf in eine Warteschlange gestellt. Die Aufgabe der Ereignisschleife besteht darin, Rückrufe in der Warteschlange auf den Stapel zu verschieben, wenn dieser frei ist.
Stellen Sie sich einen Koch vor, der alleine arbeitet. Der Koch stellt ein Gericht in den Ofen und stellt einen Timer ein, anstatt darauf zu starren. Wenn der Timer klingelt, wird die Aufgabe auf eine Liste gesetzt und der Koch nimmt sie auf, nachdem er die aktuelle Aufgabe erledigt hat.
Die beweglichen Teile
| Teil | Was es bewirkt | Beispiele |
|---|---|---|
| Aufrufstapel | Verfolgt die aktuell ausgeführten Funktionen | Ihr synchroner Code |
| Host-APIs | Arbeiten Sie außerhalb Ihres Codes | Timer, fetch, Datei liest |
| Aufgabenwarteschlange | Enthält Rückrufe, die zur Ausführung bereit sind | setTimeout, Klicks, E/A |
| Mikrotask-Warteschlange | Hält Rückrufe mit höherer Priorität | .then, await, queueMicrotask |
| Ereignisschleife | Entscheidet, was als nächstes ausgeführt wird | Läuft kontinuierlich |
Aufgaben werden manchmal Makrotasks genannt. Streng genommen kann es mehrere Aufgabenquellen geben, und die genauen Details unterscheiden sich je nach Umgebung.
Die Regeln
- Führen Sie den gesamten synchronen Code aus, bis der Aufrufstapel leer ist.
- Führen Sie alle Mikrotasks aus, einschließlich aller neu hinzugefügten.
- Rendern Sie in einem Browser ein Update, falls eines fällig ist.
- Nehmen Sie eine Aufgabe aus einer Warteschlange und führen Sie sie aus.
- Gehen Sie zurück zu Schritt 2.
Das wichtigste Detail: alle Mikrotasks, dann eine Aufgabe. Die meisten Ereignisschleifenrätsel werden durch die Anwendung dieser einzigen Regel gelöst.
Siehe die Bestellung
console.log("1 sync");
setTimeout(() => console.log("5 timeout"), 0);
Promise.resolve().then(() => console.log("3 promise"));
queueMicrotask(() => console.log("4 microtask"));
console.log("2 sync");
// 1 sync
// 2 sync
// 3 promise
// 4 microtask
// 5 timeout
Hier ist, was passiert ist. Die beiden console.log Zeilen sind synchron, also liefen sie zuerst. Der Promise-Callback und queueMicrotask gingen in die Mikrotask-Warteschlange und wurden in der Reihenfolge ausgeführt, in der sie hinzugefügt wurden, sobald der Stapel leer war. Der Timer-Rückruf musste auf einen Task-Turn warten, obwohl seine Verzögerung Null war.
Mikrotasks laufen zwischen Timern
Nach jeder einzelnen Aufgabe wird die Microtask-Warteschlange wieder geleert. Dieses Beispiel beweist es:
setTimeout(() => {
console.log("timer 1");
Promise.resolve().then(() => console.log("promise inside timer 1"));
}, 0);
setTimeout(() => console.log("timer 2"), 0);
// timer 1
// promise inside timer 1
// timer 2
Das Versprechen, das während des ersten Timers erstellt wurde, wurde vor dem zweiten Timer ausgeführt. Moderne Browser und Node.js 11 und höher verhalten sich auf diese Weise.
Wo warten passt
await teilt eine Funktion in zwei Teile. Alles davor läuft synchron und alles danach ist als Mikrotask eingeplant. Das überrascht viele Menschen:
async function task() {
console.log("A before await");
await null;
console.log("C after await");
}
task();
console.log("B after calling task");
// A before await
// B after calling task
// C after await
Eine async-Funktion startet nicht im Hintergrund. Es läuft im selben Thread, bis es seinen ersten await erreicht. Das gilt sogar, wenn man auf etwas wartet, das kein echtes Versprechen ist, wie zum Beispiel null. Weitere Informationen zu dieser Syntax finden Sie in unserem JavaScript-Async/Await-Leitfaden.
Blockieren der Schleife
Während synchroner Code ausgeführt wird, kann dies nichts anderes tun. Um dies zu zeigen, stellen wir einen Timer auf 0 ms und halten den Thread dann eine halbe Sekunde lang beschäftigt:
const start = Date.now();
setTimeout(() => console.log("timer ran after", Date.now() - start, "ms"), 0);
while (Date.now() - start < 500) {}
// timer ran after about 500 ms
Die Verzögerung des Timers ist ein Minimum und keine Garantie. Es wurde erst ausgeführt, als der Stapel frei wurde. Auf einer Webseite führt eine solche lange Schleife dazu, dass auf Klicks keine Reaktion erfolgt und die Animationen gestoppt werden. Auf einem Server muss jede andere Anfrage warten, weshalb ein langsamer synchroner Aufruf allen Benutzern eines Node.js-Prozesses schaden kann.
Zu den häufigsten Blockierungsursachen gehören große Schleifen, das Parsen sehr großer JSON-Dateien, synchrone Dateifunktionen wie readFileSync in Anforderungshandlern und katastrophale reguläre Ausdrücke.
Tipp: In Chrome DevTools markiert das Leistungsfenster Aufgaben, die länger als 50 ms dauern, als lange Aufgaben. Auf diese Weise können Sie schnell herausfinden, was dazu führt, dass sich eine Seite träge anfühlt.
Ansprechbar bleiben
Geben Sie der Ereignisschleife bei schwerer Arbeit eine Chance zum Atmen. Eine Möglichkeit besteht darin, ab und zu einen Timer anzuhalten, damit andere Aufgaben ausgeführt werden können:
const items = [0, 1, 2, 3, 4];
async function processAll() {
for (const item of items) {
if (item === 2) await new Promise((r) => setTimeout(r, 0));
console.log("item", item);
}
}
setTimeout(() => console.log("other work gets a turn"), 0);
processAll();
// item 0
// item 1
// other work gets a turn
// item 2
// item 3
// item 4
Der andere Timer lief in der Mitte, weil wir bei einer echten Aufgabe nachgegeben haben. Echter Code würde alle paar Elemente oder Millisekunden ergeben. Für wirklich CPU-intensive Arbeiten wie die Bildverarbeitung verwenden Sie einen Web Worker in Browsern oder einen Worker-Thread in Node.js, die auf separaten Threads ausgeführt werden.
Mikrotasking-Hunger
Da die Schleife die Mikrotask-Warteschlange vollständig leert, bevor sie fortfährt, kann eine Mikrotask, die immer mehr plant, alles andere stoppen. Wir haben dies mit 100.000 verketteten Mikrotasks getestet:
let count = 0;
let timerFired = false;
setTimeout(() => { timerFired = true; }, 0);
function spin() {
count++;
if (count < 100000) queueMicrotask(spin);
else console.log("timer fired during microtasks?", timerFired);
}
queueMicrotask(spin);
// timer fired during microtasks? false
Der Timer konnte erst laufen, wenn alle fertig waren. Wenn diese Kette nie enden würde, würden die Timer nie ausgelöst und in einem Browser würde die Seite nie neu gezeichnet. Beachten Sie, dass das Nachgeben mit await bei einem gelösten Versprechen hier nicht hilft, da dadurch nur eine weitere Mikroaufgabe hinzugefügt wird. Sie benötigen eine echte Aufgabe, beispielsweise einen Timer, um anderen die Möglichkeit zu geben, an die Reihe zu kommen.
Rendern in Browsern
Ein Browser erhält normalerweise die Möglichkeit, zwischen Aufgaben zu malen. Das erklärt einen häufigen Fehler:
spinner.hidden = false;
doHeavyWork(); // blocks the thread
spinner.hidden = true;
Der Spinner erscheint nie, da der Browser keine Möglichkeit hatte, zwischen diesen Zeilen zu rendern. Um das Problem zu beheben, lassen Sie einen Rahmen passieren, bevor mit der schweren Arbeit begonnen wird, oder übertragen Sie diese Arbeit einem Arbeiter. Bei Code, der das Erscheinungsbild ändert, wird requestAnimationFrame direkt vor dem nächsten Mal ausgeführt, was es zum richtigen Werkzeug für Animationen macht.
Node.js-Unterschiede
Node.js verfügt über eine eigene Ereignisschleife mit mehreren Phasen, darunter Timer, I/O-Polling und setImmediate. Es verfügt auch über process.nextTick, das in einer eigenen Warteschlange ausgeführt wird. Folgendes haben wir gesehen, als wir diese innerhalb einer asynchronen Funktion ausgeführt haben:
setTimeout(() => console.log("timeout"), 0);
setImmediate(() => console.log("immediate"));
process.nextTick(() => console.log("nextTick"));
Promise.resolve().then(() => console.log("promise"));
// promise
// nextTick
// immediate
// timeout
In vielen Artikeln heißt es, dass nextTick Versprechen immer übertrifft und dass ein Timer besser ist als setImmediate. Unser Ergebnis zeigt, dass es nicht so einfach ist. Unser Code lief bereits innerhalb einer Mikrotask, also wurde die Promise-Warteschlange zuerst fortgesetzt. Und die Reihenfolge von setTimeout und setImmediate variiert bekanntermaßen je nachdem, woher sie aufgerufen werden. Schreiben Sie also keinen Code, der von der genauen Reihenfolge dieser Elemente abhängt. Wenn eine Sache nach der anderen passieren muss, verketten Sie sie explizit.
Interview-Quiz
Versuchen Sie, die Reihenfolge herauszufinden, bevor Sie die Antwort lesen:
console.log("a");
setTimeout(() => console.log("b"), 0);
Promise.resolve().then(() => {
console.log("c");
setTimeout(() => console.log("d"), 0);
Promise.resolve().then(() => console.log("e"));
});
console.log("f");
Unser Lauf druckte a, f, c, e, b, d. Hier ist der Grund:
aundfsind synchron, daher werden sie zuerst ausgeführt.- Der Stapel ist leer, daher werden Mikrotasks ausgeführt:
c, dann die neue Mikrotaske, in derselben Runde. - Jetzt eine Aufgabe: Timer
b, die zuerst in die Warteschlange gestellt wurde. - Dann die nächste Aufgabe: Timer
d, die während der Mikrotask in die Warteschlange gestellt wurde.
Häufige Fehler
- Denken
setTimeoutist genau. Die Verzögerung ist nur minimal. - Denken
asyncbedeutet einen anderen Thread. Asynchroner Code wird zwischen Wartevorgängen immer noch im Hauptthread ausgeführt. - Sleeps verwenden, um die Reihenfolge zu korrigieren. Das Warten auf den tatsächlichen Zustand ist weitaus zuverlässiger, was auch für unzuverlässige Tests gilt.
- Verwendung von
forEachmitawait. Es wird nicht zwischen Elementen gewartet. Siehe JavaScript-Array-Methoden. - Schwere synchrone Arbeit in einem Server-Handler ausführen. Eine Anfrage kann jede andere Anfrage verzögern.
Fazit
Denken Sie an die Grundregel: Führen Sie den Stapel aus, bis er leer ist, führen Sie alle Mikrotasks aus, führen Sie dann eine Aufgabe aus und wiederholen Sie den Vorgang. Alles Weitere ergibt sich daraus. Damit es hängen bleibt, schreiben Sie Ihre eigene Version des obigen Quiz, sagen Sie das Ergebnis auf Papier voraus und führen Sie es dann durch. Wenn Sie etwas falsch machen und verstehen, warum, erfahren Sie mehr als jedes Diagramm.
Häufige Fragen
Was ist die Ereignisschleife in JavaScript?
Es handelt sich um den Mechanismus, der Rückrufe in der Warteschlange ausführt, wenn der Aufrufstapel leer ist. Damit kann Single-Threaded-JavaScript Timer, Eingaben und Netzwerkantworten ohne Blockierung verarbeiten.
Was ist der Unterschied zwischen einer Mikrotask und einer Aufgabe?
Mikrotasks wie Promise-Callbacks werden alle ausgeführt, sobald der Stapel leer ist. Aufgaben wie Timer werden einzeln ausgeführt, wobei die Mikrotasks nacheinander gelöscht werden.
Warum wird setTimeout mit 0 nicht sofort ausgeführt?
Sein Rückruf muss auf eine Aufgabenumdrehung warten. Der gesamte synchrone Code und alle Mikrotasks werden zuerst ausgeführt, und die Verzögerung ist ein Minimum und keine genaue Zeit.
Ist JavaScript Single-Threaded?
Ihr Haupt-JavaScript-Code wird in einem Thread ausgeführt. Browser und Node.js nutzen andere Threads für einige Hintergrundarbeiten, und Worker ermöglichen die parallele Ausführung von Code.
Blockiert das Warten die Ereignisschleife?
Nein. „await“ pausiert nur diese asynchrone Funktion und anderer Code kann in der Zwischenzeit ausgeführt werden. Langer synchroner Code davor oder danach kann die Schleife jedoch immer noch blockieren.
Lerne weiter
Benötigen Sie Hilfe beim Testen, WordPress oder SEO?
Wir helfen Teams, bessere Software zu liefern und ihre Websites zu erweitern. Sagen Sie uns, woran Sie gerade arbeiten, und wir schlagen Ihnen einen klaren nächsten Schritt vor.
Weitere Anleitungen finden Sie unter Tests, KI und moderne Entwicklung
Hat Ihnen dieser Artikel gefallen? Wählen Sie ein Thema und springen Sie direkt in unsere neuesten Tutorials.
KI-Halluzinationen erklärt: Warum Sprachmodelle Dinge erfinden und wie man sie reduziert
KI-Halluzinationen erklärt: Was sie sind, warum Sprachmodelle sie produzieren, gängige Typen, wie man sie mit Erdung und Eingabeaufforderungen reduz…
Artikel lesen →DevOpsErklärte Umgebungsvariablen: .env-Dateien, Geheimnisse und Konfiguration richtig gemacht
Umgebungsvariablen anhand von Python-Beispielen erklärt, die wir ausgeführt haben: Sie lesen und festlegen, warum jeder Wert ein String ist, .env-Da…
Artikel lesen →SoftwareentwicklungAPI-Ratenbegrenzung erklärt: Algorithmen, Header und Behandlung von 429-Fehlern
API-Ratenbegrenzung anhand einer von uns durchgeführten Simulation erklärt: Token-Bucket, festes Fenster, gleitendes Fenster, 429 Antworten, Ratenbe…
Artikel lesen →TestautomatisierungSpott in Python: unittest.mock, Patch und die Fehler, die Tests zum Lügen machen
Mocking in Python mit unittest.mock, getestet: Mock und return_value, side_effect, Patchen, wo ein Name verwendet wird, Spezifikation und Autospec, …
Artikel lesen →SoftwaretestsCode-Abdeckung erklärt: Leitungs- und Zweigstellenabdeckung und was 100 % wirklich bedeutet
Erklärung der Codeabdeckung anhand eines echten Coverage.py-Laufs: Zeilen-, Zweig- und Bedingungsabdeckung, Lesen eines Berichts, warum bei 100 % Ab…
Artikel lesen →Datenbanken & SQLDELETE vs. TRUNCATE vs. DROP in SQL: Unterschiede, Rollback und Verwendungszweck
DELETE vs. TRUNCATE vs. DROP erklärt mit getestetem SQL: was jeweils entfernt wird, Rollback, Trigger, Identitätsrücksetzung, Geschwindigkeit und wi…
Artikel lesen →Datenbanken & SQLErklärte SQL-Ansichten: Erstellen, nutzen und vermeiden Sie Fallstricke mit Beispielen
SQL-Ansichten anhand der von uns ausgeführten Abfragen erklärt: Erstellen einer Ansicht, Live-Ergebnisse, Ausblenden von Spalten, Leistung, aktualis…
Artikel lesen →SoftwareentwicklungTypeScript-Schnittstelle vs. Typ: Echte Unterschiede, getestet mit dem Compiler
TypeScript-Schnittstelle vs. Typ, überprüft mit dem echten Compiler: Was beide können, was nur einer kann, Deklarationszusammenführung, Erweiterunge…
Artikel lesen →SoftwareentwicklungPython *args und **kwargs erklärt: Flexible Funktionen mit klaren Beispielen
Python *args und **kwargs erklärt mit Code, den wir ausgeführt haben: Packen und Entpacken, Parameterreihenfolge, Nur-Schlüsselwort- und Nur-Positio…
Artikel lesen →SoftwareentwicklungPython-Lambda-Funktionen: Syntax, tatsächliche Verwendung und wann man sie nicht verwendet
Python-Lambda-Funktionen erklärt mit Code, den wir ausgeführt haben: Syntax, Sortierung mit Schlüssel, Karte und Filter, Abschlüsse, die Late-Bindin…
Artikel lesen →Künstliche IntelligenzWas sind KI-Agenten? Wie sie funktionieren, mit einer einfachen Agentenschleife, die Sie ausführen können
Was sind KI-Agenten? Eine einfache Anleitung zur Agentenschleife, zu Tools, Speicher und Leitplanken, mit einer kleinen Python-Schleife, die wir aus…
Artikel lesen →DevOpsÜberwachung vs. Beobachtbarkeit: Der wahre Unterschied, mit Protokollen, Metriken und Traces
Überwachung vs. Beobachtbarkeit erklärt: bekannte und unbekannte Fehler, Protokolle, Metriken und Spuren, eine exemplarische Vorgehensweise für Chec…
Artikel lesen →DevOpsDocker-Volumes vs. Bind Mounts: Containerdaten auf die richtige Art und Weise beibehalten
Docker-Volumes vs. Bind-Mounts erklärt: Warum Containerdaten verschwinden, benannte Volumes, Bind-Mounts, tmpfs, Compose-Beispiele, Backups, Berecht…
Artikel lesen →TestautomatisierungTDD vs. BDD: Hauptunterschiede, eine Funktion, die auf beide Arten entwickelt wurde und wann sie jeweils verwendet werden sollte
TDD vs. BDD erklärt mit einer Rabattfunktion, die in beide Richtungen aufgebaut ist: Rot-Grün-Refaktor mit Code, den wir ausgeführt haben, Gegeben-W…
Artikel lesen →SoftwaretestsBenutzerakzeptanztests (UAT): Prozess, Checkliste und reale Beispiele
Benutzerakzeptanztests erklärt: Wer führt ihn durch, wie unterscheidet er sich von der Qualitätssicherung, ein siebenstufiger Prozess, eine UAT-Test…
Artikel lesen →Datenbanken & SQLErklärte SQL-NULL-Werte: IS NULL, COALESCE, NULLIF und die zu vermeidenden Fallen
SQL-NULL-Werte, die mit von uns ausgeführten Abfragen erklärt wurden: dreiwertige Logik, IS NULL, COALESCE, NULLIF, wie Aggregate, Joins und Sortier…
Artikel lesen →Datenbanken & SQLSQL CASE WHEN-Anweisung: Syntax, reale Beispiele und häufige Fehler
SQL CASE WHEN anhand der von uns ausgeführten Abfragen erklärt: einfache und durchsuchte Formulare, Bedingungsreihenfolge, Pivots mit SUM, COUNT-Tri…
Artikel lesen →SoftwareentwicklungWas ist JWT? JSON-Web-Tokens anhand eines funktionierenden Beispiels erklärt
Was ist JWT? JSON Web Tokens erklärt: die drei Teile, ein Token, das in dem von uns ausgeführten Code erstellt und manipuliert wurde, JWT vs. Sitzun…
Artikel lesen →SoftwareentwicklungErklärte JavaScript-Ereignisschleife: Aufrufstapel, Mikrotasks und Timer mit Beispielen
Die JavaScript-Ereignisschleife wurde mit dem von uns ausgeführten Code erklärt: Aufrufstapel, Aufgaben- und Mikrotask-Warteschlangen, warum setTime…
Artikel lesen →SoftwareentwicklungErklärung von Python-Generatoren und -Ertrag: Sparen Sie Speicher mit echten Beispielen
Python-Generatoren und Yield anhand des von uns ausgeführten Codes erklärt: wie sie angehalten und fortgesetzt werden, gemessene Speichereinsparunge…
Artikel lesen →Künstliche IntelligenzWas sind Einbettungen? Vektoren und Kosinusähnlichkeit einfach erklärt
Was sind Einbettungen? Ein Leitfaden in einfacher Sprache zu Vektoren, Kosinusähnlichkeit und semantischer Suche, mit einem kleinen Beispiel, das wi…
Artikel lesen →DevOpsBlau-Grün vs. Canary-Bereitstellung: Unterschiede, Kompromisse und Auswahl
Blue-Green vs. Canary-Bereitstellung erklärt: Funktionsweise, Kosten, Risiko und Rollback, stabiles Benutzer-Bucketing, das wir getestet haben, Date…
Artikel lesen →TestautomatisierungFlaky-Tests: Was sie verursacht und wie man sie endgültig behebt
Flaky-Tests wurden anhand von Demos erklärt, die wir durchgeführt haben: die Hauptursachen, wie man sie bestätigt und diagnostiziert, richtige Korre…
Artikel lesen →SoftwaretestsLasttest vs. Stresstest: Unterschiede, Metriken und k6-Beispiele
Erläuterungen zu Lasttests und Stresstests: Was die einzelnen Tests beweisen, Spike- und Soak-Tests, welche Kennzahlen wichtig sind, warum Durchschn…
Artikel lesen →SoftwaretestsTestfall vs. Testszenario: Hauptunterschiede, Beispiele und wann man sie jeweils verwendet
Testfall vs. Testszenario erklärt: klare Definitionen, eine Tabelle nebeneinander, eine Funktion zum Zurücksetzen von Passwörtern, die von Szenarios…
Artikel lesen →Datenbanken & SQLSQL-Abfrageoptimierung: Ausführungspläne lesen und langsame Abfragen mit Zeitvorgaben beheben
An einer Million Zeilen getestete SQL-Abfrageoptimierung: Ausführungspläne lesen, die richtigen Indizes hinzufügen, nicht sargierbare Filter korrigi…
Artikel lesen →Datenbanken & SQLSQL UNION vs. UNION ALL: Unterschiede, Beispiele und getestete Leistung
SQL UNION vs. UNION ALL anhand der von uns ausgeführten Abfragen erklärt: Duplikate, die Regeln, denen beide folgen, ein echter Datenfehler, gemesse…
Artikel lesen →SoftwareentwicklungTutorial zur JavaScript-Abruf-API: GET, POST, Fehlerbehandlung und Zeitüberschreitungen
Ein JavaScript-Abruf-API-Tutorial, das auf einem lokalen Server getestet wurde: GET und POST, warum 404 nicht ausgelöst wird, ein wiederverwendbarer…
Artikel lesen →SoftwareentwicklungUmgang mit Python-Dateien: Lesen, Schreiben, CSV, JSON und Pathlib mit Beispielen
Die Handhabung von Python-Dateien wird anhand des von uns ausgeführten Codes erklärt: Öffnungsmodi, Lesen großer Dateien, CSV, JSON, Pathlib, Binärd…
Artikel lesen →SoftwareentwicklungPython-Klassen und -Objekte: OOP-Tutorial mit echten Beispielen
Python-Klassen und -Objekte erklärt mit Code, den wir ausgeführt haben: __init__, Methoden, Klassen- und Instanzattribute, Vererbung, Eigenschaften,…
Artikel lesen →Künstliche IntelligenzWas ist ein großes Sprachmodell? Wie LLMs funktionieren, ohne großen Hype erklärt
Was ist ein großes Sprachmodell? LLMs im Klartext erklärt: Token, Einbettungen, Aufmerksamkeit, Training, Temperatur- und Kontextfenster, eine klein…
Artikel lesen →DevOpsLinux-Befehle für Anfänger: Der grundlegende Terminal-Leitfaden mit Beispielen
Linux-Befehle für Anfänger, gruppiert nach Aufgaben: Navigation, Dateien, Anzeigen von Protokollen, Grep, Pipes, Berechtigungen, Prozesse und Archiv…
Artikel lesen →TestautomatisierungSelenium vs. Playwright: Hauptunterschiede, Code im Vergleich und welche Sie wählen sollten
Selenium vs. Playwright im Vergleich: Architektur, Wartezeit, Browser- und Sprachunterstützung, Debugging, der gleiche Test in beiden Tools, Migrati…
Artikel lesen →SoftwaretestsÄquivalenzpartitionierung: Testdesigntechnik anhand von Beispielen erklärt
Erklärung der Äquivalenzpartitionierung: Wie man gültige und ungültige Partitionen findet, Beispiele für Alter, Passwörter und Gutscheine, von uns d…
Artikel lesen →SoftwareentwicklungGit merge vs rebase: Unterschiede, Beispiele und wann man was nutzt
Git merge vs rebase erklärt mit echter Log-Ausgabe, einer Vergleichstabelle, der goldenen Regel des Rebase und einem sicheren Team-Workflow.
Artikel lesen →SoftwareentwicklungPython List Comprehension: Syntax, Beispiele und wann man darauf verzichtet
Python List Comprehension erklärt: Syntax, Filter, if-else, verschachtelte Schleifen, gemessene Zeiten und Fälle, in denen eine normale for-Schleife…
Artikel lesen →Datenbanken & SQLSQL Joins erklärt mit Beispielen (Inner, Left, Right, Full)
SQL Joins Schritt für Schritt mit Beispieltabellen und Abfragen verstehen: INNER, LEFT, RIGHT, FULL, CROSS und SELF, plus typische Fehler und Perfor…
Artikel lesen →