Heim >Web-Frontend >js-Tutorial >MultiThreading in JS mit Web Workern
Web Worker: eine Möglichkeit, Skripte im Hintergrund in einem anderen Thread als dem aktuellen Hauptthread (Fenster) auszuführen.
JavaScript verarbeitet normalerweise asynchrone Vorgänge, indem es Aufgaben in entsprechende Warteschlangen stellt (Makro-Aufgaben-Warteschlange, Mikro-Aufgaben-Warteschlange), wobei die Ereignisschleife diese Warteschlangen kontinuierlich überprüft und Aufgaben in den Aufrufstapel schiebt, wenn sie zur Ausführung bereit sind. Dieser Ansatz gewährleistet eine nicht blockierende Ausführung, führt aber dennoch alles in einem einzigen Thread aus.
Web Worker hingegen ermöglichen die Ausführung von Skripten in einem völlig separaten Thread mit eigenem Aufrufstapel, asynchronen Warteschlangen und Ereignisschleife. Diese Trennung verhindert, dass der Hauptthread durch schwere Berechnungen oder lang laufende Aufgaben blockiert wird, da der Worker unabhängig arbeitet.
Web-Worker führen Skripte in einem anderen Kontext als dem Hauptfensterkontext aus und ermöglichen so Parallelität in Webanwendungen. Die Web Worker API stellt mehrere Arten von Workern bereit:
Dieser Artikel konzentriert sich auf engagierte Mitarbeiter, die am einfachsten zu implementieren sind und am häufigsten verwendet werden.
Um einen Web-Worker zu erstellen, können Sie die folgenden Schlüsselmethoden verwenden:
Lassen Sie uns einen Worker erstellen, um Daten von einer API abzurufen, insbesondere Hundebilder von der Dog CEO API.
Hier ist die Implementierung des Worker-Skripts. Beachten Sie, dass self innerhalb des Workers verwendet wird, um sich auf den globalen Kontext zu beziehen:
if (window.Worker) { const worker = new Worker("/src/worker.js"); worker.postMessage({ operation: "get_dog_imgs", url: "https://dog.ceo/api/breeds/image/random", count: 5 //number of photos }); worker.onmessage = (e) => { console.log(e.data); if (e && e.data) { setdata((old) => [...old, e.data]); // update react state showCallStack(); // function to show the callstack } }; worker.onerror = (e) => { console.log(e); }; }
In diesem Code lauscht der Worker auf Nachrichten (onmessage) und ruft Daten von der angegebenen URL mehrmals ab, wie durch die Anzahl angegeben.
So sieht der Aufrufstapel im Worker aus:
Der Hauptthread verwendet den Worker wie folgt:
self.onmessage = (event) => { const data = event.data; if (data && data.url && data.count) { fetchFromUrls(data.url, data.count); } } // fetch single data const fetchdata = async (url) => { const res = await self.fetch(url); return await res.json(); }; const fetchFromUrls = async (url, count) => { showCallStack(); // showing the callstack of the worker for (const i of new Array(count).fill(0)) { let data = await fetchdata(url); if (data && data.message) { self.postMessage({ type: "img", data: data.message }); } } };
Dieser Code zeigt, wie man eine Nachricht an den Worker sendet und die abgerufenen Daten im Hauptthread empfängt.
Für den vollständigen Code gehen Sie zu Code
Während Web-Worker in einem separaten Thread vom Hauptfenster-Thread ausgeführt werden, unterliegen sie bestimmten Einschränkungen:
Das obige ist der detaillierte Inhalt vonMultiThreading in JS mit Web Workern. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!