Sobes.tech
Middle

¿Qué son los web workers y para qué sirven?

sobes.tech AI

Respuesta de la IA

Los web workers son una forma de ejecutar scripts en hilos en segundo plano, separados del hilo principal de la interfaz de usuario.

Su propósito principal:

  • Mejorar el rendimiento: Trasladar tareas que consumen muchos recursos (cálculos complejos, procesamiento de grandes volúmenes de datos, análisis) del hilo principal, que se encarga de renderizar la interfaz y gestionar eventos del usuario. Esto previene que la página se congele y mejora la capacidad de respuesta de la aplicación.
  • Paralelismo: Permite realizar varias tareas simultáneamente, aprovechando de manera más eficiente los procesadores multinúcleo.

Existen tres tipos de web workers:

  1. Dedicated Workers: Asociados a una página específica y solo accesibles desde ella.
  2. Shared Workers: Pueden ser accesibles desde varias páginas o pestañas del mismo dominio.
  3. Service Workers: Funcionan como proxies de red, interceptando solicitudes de red y permitiendo implementar funcionalidades offline, notificaciones push y otras capacidades de las aplicaciones web progresivas (PWA).

Principios de funcionamiento:

  • Contexto separado: El worker tiene su propio objeto global y acceso a un subconjunto de la API del navegador (sin acceso al DOM, window, document, parent).
  • Intercambio de mensajes: La interacción entre el hilo principal y el worker se realiza mediante mensajes usando postMessage() y el manejador de eventos onmessage. Los datos se transmiten por valor (copiados) o por referencia (Objetos Transferibles).

Ejemplo de uso de un Worker dedicado:

// main.js (hilo principal)
const worker = new Worker('worker.js'); // Creación del worker

worker.onmessage = (event) => {
  // Procesamiento del mensaje del worker
  console.log('Recibido del worker:', event.data);
};

worker.postMessage('Iniciar operación compleja'); // Envío de mensaje al worker
// worker.js (archivo del worker)
onmessage = (event) => {
  // Procesamiento del mensaje del hilo principal
  console.log('Recibido del hilo principal:', event.data);

  // Realización de tarea compleja
  let result = 0;
  for (let i = 0; i < 1000000000; i++) {
    result += i;
  }

  // Envío del resultado de vuelta
  postMessage(result);
};