Controle de Concorrência
- p-limit:
p-limit
é uma biblioteca projetada especificamente para limitar a concorrência de promessas. Ela permite que você defina um limite no número de promessas que podem ser executadas simultaneamente, ajudando a controlar o uso de recursos e a evitar sobrecarga em operações assíncronas. É uma solução leve e eficiente para gerenciamento de concorrência. - async:
A biblioteca
async
oferece controle de concorrência através de funções comoasync.eachLimit
easync.mapLimit
, que permitem especificar um limite no número de tarefas que são executadas simultaneamente. Isso ajuda a evitar sobrecarga em operações assíncronas, como chamadas de API ou processamento de arquivos. - bluebird:
bluebird
fornece controle de concorrência avançado através de sua API de promessas, permitindo que os desenvolvedores limitem o número de promessas que são executadas ao mesmo tempo usando métodos comoPromise.map
com um parâmetro de concorrência. Isso é especialmente útil para otimizar o desempenho ao lidar com operações assíncronas em larga escala. - promise-queue:
promise-queue
implementa uma fila de promessas com suporte a limite de concorrência. Ele garante que as promessas sejam executadas em ordem e que a concorrência possa ser limitada, o que é útil para cenários onde a ordem das operações é importante e o controle de concorrência é necessário. - promise-limit:
promise-limit
é uma implementação simples que limita a concorrência de promessas, garantindo que apenas um número especificado de promessas seja executado ao mesmo tempo. Isso ajuda a evitar sobrecarga em recursos limitados, como APIs ou bancos de dados, tornando-a uma ferramenta útil para gerenciamento de concorrência em tarefas assíncronas.
Ordem de Execução
- p-limit:
p-limit
não garante a ordem de execução das promessas, pois se concentra em limitar a concorrência. Para manter a ordem, você precisaria combinarp-limit
com uma abordagem que garante a ordem, como encadear promessas ou usarPromise.all
após a conclusão das promessas limitadas. - async:
A biblioteca
async
não garante a ordem de execução das tarefas, a menos que você use funções específicas comoasync.eachSeries
ouasync.mapSeries
, que executam as tarefas em série, uma de cada vez. Para controle de ordem, você deve escolher as funções apropriadas com base nas suas necessidades. - bluebird:
bluebird
mantém a ordem de execução das promessas por padrão. Quando você usa métodos comoPromise.all
ouPromise.map
, as promessas são resolvidas na ordem em que foram criadas. No entanto, a ordem pode ser afetada se você estiver lidando com promessas concorrentes, a menos que você as gerencie explicitamente. - promise-queue:
promise-queue
garante a ordem de execução das promessas, pois as promessas são executadas em uma fila, uma de cada vez. Isso significa que as promessas são resolvidas na ordem em que foram adicionadas à fila, o que é ideal para cenários onde a ordem das operações é crítica. - promise-limit:
promise-limit
não garante a ordem de execução das promessas, pois sua principal função é limitar a concorrência. Para garantir a ordem, você precisaria implementar uma lógica adicional que sequencie as promessas enquanto limita a concorrência.
Exemplo de Código
- p-limit:
Exemplo de Limitação de Concorrência com
p-limit
:const pLimit = require('p-limit'); const limit = pLimit(2); const tarefas = [ () => new Promise(resolve => setTimeout(() => { console.log('Tarefa 1'); resolve(); }, 1000)), () => new Promise(resolve => setTimeout(() => { console.log('Tarefa 2'); resolve(); }, 500)), () => new Promise(resolve => setTimeout(() => { console.log('Tarefa 3'); resolve(); }, 2000)), ]; const tarefasLimitadas = tarefas.map(tarefa => limit(tarefa)); Promise.all(tarefasLimitadas);
- async:
Exemplo de Limitação de Concorrência com
async
:const async = require('async'); const tarefas = [ (callback) => setTimeout(() => { console.log('Tarefa 1'); callback(); }, 1000), (callback) => setTimeout(() => { console.log('Tarefa 2'); callback(); }, 500), (callback) => setTimeout(() => { console.log('Tarefa 3'); callback(); }, 2000), ]; // Limitar a 2 tarefas concorrentes async.eachLimit(tarefas, 2, (tarefa, callback) => { tarefa(callback); });
- bluebird:
Exemplo de Limitação de Concorrência com
bluebird
:const Promise = require('bluebird'); const tarefas = [ () => new Promise(resolve => setTimeout(() => { console.log('Tarefa 1'); resolve(); }, 1000)), () => new Promise(resolve => setTimeout(() => { console.log('Tarefa 2'); resolve(); }, 500)), () => new Promise(resolve => setTimeout(() => { console.log('Tarefa 3'); resolve(); }, 2000)), ]; // Limitar a 2 tarefas concorrentes Promise.map(tarefas, tarefa => tarefa(), { concurrency: 2 });
- promise-queue:
Exemplo de Fila de Promessas com
promise-queue
:const PromiseQueue = require('promise-queue'); const queue = new PromiseQueue(2, Infinity); const tarefas = [ () => new Promise(resolve => setTimeout(() => { console.log('Tarefa 1'); resolve(); }, 1000)), () => new Promise(resolve => setTimeout(() => { console.log('Tarefa 2'); resolve(); }, 500)), () => new Promise(resolve => setTimeout(() => { console.log('Tarefa 3'); resolve(); }, 2000)), ]; tarefas.forEach(tarefa => queue.add(tarefa));
- promise-limit:
Exemplo de Limitação de Concorrência com
promise-limit
:const promiseLimit = require('promise-limit'); const limit = promiseLimit(2); const tarefas = [ () => new Promise(resolve => setTimeout(() => { console.log('Tarefa 1'); resolve(); }, 1000)), () => new Promise(resolve => setTimeout(() => { console.log('Tarefa 2'); resolve(); }, 500)), () => new Promise(resolve => setTimeout(() => { console.log('Tarefa 3'); resolve(); }, 2000)), ]; const tarefasLimitadas = tarefas.map(tarefa => limit(tarefa())); Promise.all(tarefasLimitadas);