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.
Aquí tienes una definición rápida de cada uno que ilustra las diferencias entre ambos:
Para ser exhaustivos, aquí tienes una definición de la ejecución síncrona:
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.
Regístrate en Exercism para aprender y dominar JavaScript con 37 conceptos159 ejercicios y mentoría humana real, todo gratis.
Exploramos las diferencias entre concurrencia y paralelismo, viendo los distintos enfoques que adoptan lenguajes como JavaScript, Go, Elixir y Rust.