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
asyncoferece controle de concorrência através de funções comoasync.eachLimiteasync.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:
bluebirdfornece 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.mapcom 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-queueimplementa 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-limitnão garante a ordem de execução das promessas, pois se concentra em limitar a concorrência. Para manter a ordem, você precisaria combinarp-limitcom uma abordagem que garante a ordem, como encadear promessas ou usarPromise.allapós a conclusão das promessas limitadas. - async:
A biblioteca
asyncnão garante a ordem de execução das tarefas, a menos que você use funções específicas comoasync.eachSeriesouasync.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:
bluebirdmantém a ordem de execução das promessas por padrão. Quando você usa métodos comoPromise.allouPromise.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-queuegarante 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-limitnã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);
