Conte a frequência das letras em textos usando computação paralela.
O paralelismo consiste em fazer em paralelo coisas que também podem ser feitas de forma sequencial. Um exemplo comum é contar a frequência das letras. Use o paralelismo para calcular a frequência total de cada letra em uma lista de textos.
O JavaScript é single-threaded por natureza, então faltam a ele muitas das características que outras linguagens têm para lidar com a execução de código em paralelo.
Na verdade, a única forma de conseguir uma execução de código "realmente" paralela é por meio de Worker threads (também chamados de Web Workers).
Quase sempre, um código que parece executar em paralelo,
como async functions ou Promises, na verdade executa de forma concorrente.
Isso costuma ser melhor, já que o JavaScript moderno é otimizado para esse uso,
e você vai ver com frequência códigos que "emulam" (ou "trapaceiam") a execução paralela usando Promise.all() e outros métodos de execução concorrente.
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.
Veja uma definição rápida de cada um, que ilustra as diferenças entre os dois:
Para completar, veja uma definição de execução síncrona:
Mesmo que o JavaScript seja single-threaded por padrão, existe uma forma de executar código de maneira paralela.
Se você estiver rodando JavaScript no navegador (por exemplo, em um app web), a forma de conseguir paralelismo é por meio da Web Worker API. Como descrito pela MDN:
Web Workers torna possível executar uma operação de script em uma thread em segundo plano, separada da thread principal de execução de uma aplicação.
Por outro lado, se seu JavaScript estiver rodando no Node.js, que é o runtime alvo do Exercism, esse mesmo conceito é conhecido 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!
Veja uma demonstração simples da Web Worker API (retirada do 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);
};
E aqui está uma demonstração da Worker threads API (retirada da documentação)
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 extra, pense se sua implementação pode ser adaptada para usar Worker threads.
Crie sua conta no Exercism para aprender e dominar JavaScript com 37 conceitos159 exercícios e mentoria humana de verdade, tudo de graça.
Exploramos as diferenças entre concorrência e paralelismo, vendo as diferentes abordagens adotadas por linguagens como JavaScript, Go, Elixir e Rust.