Web Worker : un moyen d'exécuter des scripts en arrière-plan dans un thread différent du thread principal (fenêtre) actuel.
JavaScript gère généralement les opérations asynchrones en plaçant les tâches dans les files d'attente correspondantes (file d'attente de macro-tâches, file d'attente de micro-tâches), la boucle d'événements vérifiant en permanence ces files d'attente et poussant les tâches dans la pile d'appels lorsqu'elles sont prêtes à être exécutées. Cette approche garantit une exécution non bloquante mais exécute toujours tout sur un seul thread.
LesWeb Workers, quant à eux, permettent aux scripts de s'exécuter dans un thread complètement séparé avec sa propre pile d'appels, des files d'attente asynchrones et une boucle d'événements. Cette séparation empêche le thread principal d'être bloqué par des calculs lourds ou des tâches de longue durée, car le travailleur fonctionne de manière indépendante.
Les Web Workers exécutent des scripts dans un contexte différent de celui de la fenêtre principale, permettant ainsi le parallélisme dans les applications Web. L'API Web Worker propose plusieurs types de travailleurs :
Cet article se concentre sur les travailleurs dédiés, qui sont les plus simples à mettre en œuvre et les plus couramment utilisés.
Pour créer un web worker, vous pouvez utiliser les méthodes clés suivantes :
Créons un travailleur pour récupérer les données d'une API, en particulier les images de chiens de l'API Dog CEO.
Voici l’implémentation du script de travail. Notez qu'à l'intérieur du travailleur, self est utilisé pour désigner le contexte global :
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); }; }
Dans ce code, le travailleur écoute les messages (onmessage) et récupère les données de l'URL donnée plusieurs fois, comme spécifié par le nombre.
Voici à quoi ressemble la pile d'appels à l'intérieur du travailleur :
Le thread principal utilise le travailleur comme ceci :
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 }); } } };
Ce code montre comment envoyer un message au travailleur et recevoir les données récupérées dans le thread principal.
pour le code complet, allez sur code
Bien que les Web Workers s'exécutent dans un thread distinct du thread de la fenêtre principale, ils présentent certaines limitations :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!