Conta a frequência das letras em textos recorrendo a computação paralela.
O paralelismo consiste em fazer em paralelo coisas que também podem ser feitas sequencialmente. Um exemplo comum é contar a frequência de letras. Usa o paralelismo para calcular a frequência total de cada letra numa lista de textos.
O JavaScript é, por natureza, single-threaded, pelo que não tem muitas das funcionalidades que outras linguagens oferecem para lidar com a execução paralela de código.
Na verdade, a única forma de conseguir uma execução paralela de código "real" é através de Worker threads (também conhecidos como Web Workers).
Quase sempre, o código que parece ser executado em paralelo,
como as async functions ou as Promises, acaba por ser executado em simultâneo.
Isto é muitas vezes melhor, porque o JavaScript moderno está otimizado para esse tipo de utilização,
e vais ver com frequência código que "emula" (ou "trapaceia") a execução paralela recorrendo a Promise.all() e a 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.
Eis uma definição rápida de cada um que ilustra as diferenças entre os dois:
Para sermos completos, eis uma definição de execução síncrona:
Apesar de o JavaScript ser single-threaded por predefinição, há uma forma de executar código em paralelo.
Se estiveres a executar JavaScript no navegador (por exemplo, numa aplicação web), a forma de conseguir paralelismo é através da Web Worker API. Como descreve a MDN:
Os Web Workers tornam possível executar uma operação de script numa thread em segundo plano separada da thread principal de execução de uma aplicação.
Por outro lado, se o teu JavaScript estiver a correr em Node.js, que é o ambiente de execução de destino 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!
Eis 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, pensa se a tua implementação pode ser adaptada para tirar partido dos Worker threads.
Inscreve-te no Exercism para aprenderes e dominares JavaScript com 37 conceitos159 exercícios, e mentoria humana real, tudo grátis.
Exploramos as diferenças entre concorrência e paralelismo, analisando as diferentes abordagens adotadas por linguagens como JavaScript, Go, Elixir e Rust.