Rutas
/
JavaScript
JavaScript
/
Ejercicios
/
Frecuencia de letras en paralelo
Frecuencia de letras en paralelo

Frecuencia de letras en paralelo

Media

Instrucciones

Cuenta la frecuencia de las letras en textos mediante computación en paralelo.

El paralelismo consiste en hacer en paralelo cosas que también se pueden hacer de forma secuencial. Un ejemplo habitual es contar la frecuencia de letras. Utiliza el paralelismo para calcular la frecuencia total de cada letra en una lista de textos.

JavaScript es de un solo hilo por naturaleza, así que carece de muchas de las características del lenguaje que otros lenguajes tienen para gestionar la ejecución de código en paralelo. De hecho, la única forma de conseguir una ejecución de código «real» en paralelo es mediante los Worker threads (también conocidos como Web Workers).

Casi siempre, el código que parece ejecutarse en paralelo, como las async functions o las Promises, en realidad se ejecutará de forma concurrente. A menudo esto es mejor, ya que el JavaScript moderno está optimizado para ese uso, y verás con frecuencia código que «emula» (o «hace trampas» para conseguir) la ejecución en paralelo mediante el uso de Promise.all() y otros métodos de ejecución concurrente.

To pass the tests for this exercise, your solution needs to execute _concurrently_ (or in parallel),
meaning that synchronous solutions (e.g. a simple `for` loop) will not pass.

Concurrencia frente a paralelismo

Aquí tienes una definición rápida de cada uno que ilustra las diferencias entre ambos:

  • La concurrencia es cuando dos o más tareas pueden empezar, ejecutarse y completarse en periodos de tiempo solapados, siendo ejecutadas por la misma unidad de procesamiento.
  • El paralelismo es cuando dos o más tareas pueden empezar y ejecutarse al mismo tiempo, siendo ejecutadas de forma independiente entre sí por unidades de procesamiento distintas.

Para ser exhaustivos, aquí tienes una definición de la ejecución síncrona:

  • La ejecución síncrona es cuando una tarea tiene que esperar a que otra tarea en ejecución termine antes de poder ejecutarse.

El paralelismo en JavaScript

Aunque JavaScript es de un solo hilo por defecto, hay una forma de ejecutar código en paralelo.

Si ejecutas JavaScript en el navegador (por ejemplo, en una aplicación web), la forma de conseguir paralelismo es mediante la Web Worker API. Tal y como describe MDN:

Web Workers permite ejecutar la operación de un script en un hilo en segundo plano separado del hilo principal de ejecución de una aplicación.

Por otro lado, si tu JavaScript se ejecuta en Node.js, que es el entorno de ejecución objetivo de Exercism, este mismo concepto se conoce como Worker threads.

Be aware that the implementation of the worker API differs largely between browsers and other JavaScript environments.

Make sure to read the documentation for your specific runtime!

Aquí tienes una demostración sencilla de la Web Worker API (tomada de Medium)

// main.js
const myWorker = new Worker('worker.js');

myWorker.postMessage(5);

myWorker.onmessage = function (event) {
  console.log('Received result from worker:', event.data);
};
// worker.js
onmessage = function (event) {
  console.log('Received number from main thread:', event.data);

  // Perform computation
  const result = event.data * 2;

  // Send result back to the main thread
  postMessage(result);
};

Y aquí tienes una demostración de la Worker threads API (tomada de la documentación)

const {
  Worker,
  isMainThread,
  parentPort,
  workerData,
} = require('node:worker_threads');

if (isMainThread) {
  module.exports = function parseJSAsync(script) {
    return new Promise((resolve, reject) => {
      const worker = new Worker(__filename, {
        workerData: script,
      });
      worker.on('message', resolve);
      worker.on('error', reject);
      worker.on('exit', (code) => {
        if (code !== 0)
          reject(new Error(`Worker stopped with exit code ${code}`));
      });
    });
  };
} else {
  const { parse } = require('some-js-parsing-library');
  const script = workerData;
  parentPort.postMessage(parse(script));
}
Currently it is not possible to implement parallelism using the online editor.

Please implement `Worker threads` using Node.js locally and submit your solution via CLI!

Como objetivo adicional, piensa si tu implementación puede adaptarse para hacer uso de los Worker threads.


Lecturas adicionales

Editar en GitHub El enlace se abre en una ventana o pestaña nueva
JavaScript Exercism

¿Listo para empezar Frecuencia de letras en paralelo?

Regístrate en Exercism para aprender y dominar JavaScript con 37 conceptos159 ejercicios y mentoría humana real, todo gratis.

¡Análisis en profundidad de Frecuencia de letras en paralelo!

Exploramos las diferencias entre concurrencia y paralelismo, viendo los distintos enfoques que adoptan lenguajes como JavaScript, Go, Elixir y Rust.