Percursos
/
JavaScript
JavaScript
/
Exercícios
/
Frequência de letras em paralelo
Frequência de letras em paralelo

Frequência de letras em paralelo

Médio

Instruções

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.

Concorrência vs. paralelismo

Eis uma definição rápida de cada um que ilustra as diferenças entre os dois:

  • A concorrência acontece quando duas ou mais tarefas podem começar, decorrer e terminar em períodos de tempo sobrepostos, sendo executadas pela mesma unidade de processamento.
  • O paralelismo acontece quando duas ou mais tarefas podem começar e decorrer ao mesmo tempo, sendo executadas de forma independente umas das outras por unidades de processamento separadas.

Para sermos completos, eis uma definição de execução síncrona:

  • A execução síncrona acontece quando uma tarefa tem de esperar que outra tarefa em execução termine antes de poder avançar.

Paralelismo em JavaScript

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.


Leitura adicional

Editar via GitHub A ligação abre numa nova janela ou separador
JavaScript Exercism

Estás pronto para começar Frequência de letras em paralelo?

Inscreve-te no Exercism para aprenderes e dominares JavaScript com 37 conceitos159 exercícios, e mentoria humana real, tudo grátis.

Mergulha a fundo em Frequência de letras em paralelo!

Exploramos as diferenças entre concorrência e paralelismo, analisando as diferentes abordagens adotadas por linguagens como JavaScript, Go, Elixir e Rust.