Web Worker: una forma de ejecutar scripts en segundo plano en un hilo diferente al hilo principal (Ventana) actual.
JavaScript generalmente maneja operaciones asincrónicas colocando tareas en las colas correspondientes (cola de macrotareas, cola de microtareas), con el bucle de eventos verificando continuamente estas colas y empujando las tareas a la pila de llamadas cuando están listas para ejecutarse. Este enfoque garantiza una ejecución sin bloqueo pero aún así ejecuta todo en un solo subproceso.
Web Workers, por otro lado, permite que los scripts se ejecuten en un hilo completamente separado con su propia pila de llamadas, colas asincrónicas y bucle de eventos. Esta separación evita que el hilo principal quede bloqueado por cálculos pesados o tareas de larga duración, ya que el trabajador opera de forma independiente.
Los trabajadores web ejecutan scripts en un contexto diferente al contexto de la ventana principal, lo que permite el paralelismo en las aplicaciones web. La API Web Worker proporciona varios tipos de trabajadores:
Este artículo se centra en los trabajadores dedicados, que son los más sencillos de implementar y los más utilizados.
Para crear un trabajador web, puedes utilizar los siguientes métodos clave:
Creemos un trabajador para recuperar datos de una API, específicamente imágenes de perros de la API Dog CEO.
Aquí está la implementación del script del trabajador. Observe que dentro del trabajador, self se usa para referirse al contexto 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); }; }
En este código, el trabajador escucha los mensajes (onmessage) y recupera datos de la URL dada varias veces según lo especificado en el recuento.
Así es como se ve la pila de llamadas dentro del trabajador:
El hilo principal usa el trabajador de esta manera:
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 }); } } };
Este código demuestra cómo enviar un mensaje al trabajador y recibir los datos obtenidos en el hilo principal.
para ver el código completo, vaya al código
Aunque los trabajadores web se ejecutan en un hilo separado del hilo de la ventana principal, tienen ciertas limitaciones:
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3