Trabajadores web en Javascript

Los trabajadores web nos brindan la posibilidad de escribir Javascript de subprocesos múltiples, que no bloquea el DOM. Incluso las operaciones asincrónicas bloquean el DOM hasta cierto punto. Por otro lado, los trabajadores web nos ayudan a resolver este problema, escapando del entorno de un solo subproceso y logrando un mayor rendimiento de nuestras páginas web.

Para usar:

  • Los trabajadores web viven en su propio archivo (sin interactuar con la interfaz de usuario)
  • Las funciones se pasan por copia
  • No se permiten variables globales
  • Implementación de trabajadores web

    /* -----------------------------Index.JS--------------------------*/
      
      // Check if web worker functionality is available for the browser
            if(window.Worker){
              
                // Creating new web worker using constructor
                var worker = new Worker('worker.js');
                  
                  
                var message = 'Hello';
              
                // Sending the message using postMessage
                worker.postMessage(message);
                  
                // On response
                worker.onmessage = function(e) {
                    console.log(e.data);
                };
              
            }
      
      
    /* -----------------------------Worker.JS--------------------------*/
      
    // Waits for any activity from the page
    self.onmessage = function(e) {
        if(e.data !== undefined) {
            // Do work 
            var total = e.data + ' World';
            // Posting back to the page
            self.postMessage(total)
        }
    }
    // Terminate with: worker.terminate()
    

    En el ejemplo anterior, el trabajador está haciendo el trabajo de concatenar la string recibida con la definida y la envía de vuelta al archivo main.js sin interrumpir la página.

    Output :'Hello World'
    

    Web Workers no tiene acceso a:

  • El objeto principal
  • El objeto de la ventana
  • El objeto del documento
  • El DOM
  • Sin embargo, tienen acceso a:

  • El objeto de ubicación
  • El objeto navegador
  • XMLHttpSolicitud
  • La caché de aplicaciones
  • Generación de otros trabajadores web (almacenados en el mismo origen que la página principal)
  • Importación de secuencias de comandos externas mediante importScripts()
  • Casos de uso comunes:

  • Cuando se requieren cálculos informáticos complejos
  • En juegos HTML5 (velocidad de fotogramas más alta)
  • En cualquier sitio web que contenga JavaScript para mejorar el rendimiento
  • Ejemplo del mundo real

    El siguiente programa está escrito para mostrar qué diferencia hay en el comportamiento de nuestra página con y sin trabajador.

    /* -----------------------------Index.JS--------------------------*/
    const delay = 5000;
      
    // Get element of without worker button
    const noWorkerBtn = document.getElementById('worker--without');
    // Add event listener to the button itself
    noWorkerBtn.addEventListener('click', () => {
        // Define the starting time
        const start = performance.now();
        // Do complex calculations
        while (performance.now() - start < delay);
        // Get the ending time
        const end = performance.now();
        // Calculate the difference in time
        const resWithoutWorker = end - start;
        // Log the result
        console.log('No worker:', resWithoutWorker);
          
    });
      
    // Define a worker
    const worker = new Worker('./worker.js');
      
    // Get element of with worker button
    const workerBtn = document.getElementById('worker--with');
      
    // Add event listener to the button
    workerBtn.addEventListener('click', () => {
        // Send delay number
        worker.postMessage(delay);
          
    });
    // On message from worker
    worker.onmessage = e => {
        // Log the result
        console.log("With worker: ", e.data);
    };
      
    /* -----------------------------Worker.JS--------------------------*/
      
    // On message received
    this.onmessage = e => {
        // Delay equals to data received
        const delay = e.data;
        // Define starting time
        const start = performance.now();
        // Do the complex calculation
        while (performance.now() - start < delay);
        // Get ending time
        const end = performance.now();
        // Calculate difference
        const resWithWorker = end - start;
        // Send result
        this.postMessage(end - start);
    };
    

    Ejemplos:

    Output: 'No worker: 5000'
    Output: 'With worker:  5000'
    

    Así es como se comporta la página sin nuestro código de trabajo:

  • La animación se congela porque JavaScript está bloqueando el DOM .
  • Complex Calculation Without a Web Worker

    Comportamiento de la página sin webworker

    Así es como se comporta la página con nuestro código de trabajo:

  • Como puede ver, la animación de fondo no se interrumpe ya que nuestro trabajador hace el cálculo por nosotros. De esta forma, dejamos que el subproceso DOM se ejecute de forma independiente.
  • Complex Calculation with a Web Worker

    Comportamiento de la página con webworker

    Publicación traducida automáticamente

    Artículo escrito por MihailYonchev y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *