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

Frecuencia de letras en paralelo

Intermedia

Instrucciones

Cuenta la frecuencia de las letras en textos usando computación paralela.

El paralelismo consiste en hacer en paralelo cosas que también se pueden hacer de forma secuencial. Un ejemplo común es contar la frecuencia de las letras. Usa 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 de lenguaje que otros lenguajes tienen para manejar la ejecución de código en paralelo. De hecho, la única forma de lograr una ejecución de código «real» en paralelo es mediante 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 ejecuta de forma concurrente. Esto suele ser mejor, ya que el JavaScript moderno está optimizado para ese uso, y a menudo verás código que «emula» (o «hace trampa») 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 vs. 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 períodos de tiempo superpuestos, 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 que quede todo completo, aquí tienes una definición de 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.

Paralelismo en JavaScript

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

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

Web Workers permite ejecutar una operación de 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, considera si tu implementación se puede adaptar para hacer uso de Worker threads.


Lecturas adicionales

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

¿Todo 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.

¡Profundiza en 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.