Trilhas
/
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

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.

Concorrência vs. paralelismo

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

  • Concorrência é quando duas ou mais tarefas podem começar, rodar e terminar em períodos de tempo sobrepostos, sendo executadas pela mesma unidade de processamento.
  • Paralelismo é quando duas ou mais tarefas podem começar e rodar ao mesmo tempo, sendo executadas de forma independente entre si por unidades de processamento separadas.

Para completar, veja uma definição de execução síncrona:

  • Execução síncrona é quando uma tarefa precisa esperar outra tarefa em execução terminar antes de poder rodar.

Paralelismo em JavaScript

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.


Leitura adicional

Editar via GitHub O link abre em uma nova janela ou aba
JavaScript Exercism

Tudo pronto para começar Frequência de Letras em Paralelo?

Crie sua conta no Exercism para aprender e dominar JavaScript com 37 conceitos159 exercícios e mentoria humana de verdade, tudo de graça.

Mergulho profundo em Frequência de Letras em Paralelo!

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