p-limit:Node.js 异步任务并发控制工具
sindresorhus 开源的异步并发控制工具 p-limit,目前已获得 2856 Star:
p-limit 是一款轻量级的 JavaScript 库,用于限制异步函数的并发执行数量,同时支持 Node.js 和浏览器环境。在处理大量异步任务时,p-limit 可以避免因同时发起过多请求导致的资源耗尽或接口限流问题。
p-limit 的使用场景包括批量网络请求、文件处理、数据库操作等需要控制并发量的场景。该库被超过 3570 万个项目依赖,稳定性经过广泛验证。
安装
通过 npm 命令安装 p-limit:
npm install p-limit
使用方法
基础使用步骤如下:
- 导入 p-limit 模块
- 创建一个限流器实例,指定最大并发数
- 将异步函数包装在限流器中
- 使用 Promise.all 执行所有任务
示例代码:
import pLimit from 'p-limit';
// 限制同时执行的任务数量为1
const limit = pLimit(1);
const input = [
limit(() => fetchSomething('foo')),
limit(() => fetchSomething('bar')),
limit(() => doSomething())
];
// 同一时间只有一个Promise在执行
const result = await Promise.all(input);
console.log(result);
主要功能
p-limit 提供以下核心功能:
基础并发限制
通过 pLimit(concurrency) 创建限流器,concurrency 参数指定最大并发数。也可以传入配置对象,包含 concurrency 和 rejectOnClear 选项。rejectOnClear 设为 true 时,调用 clearQueue() 会将未执行的任务以 AbortError 拒绝,避免任务永远处于 pending 状态。
任务包装
limit(fn, ...args) 方法会返回一个 Promise,执行时会遵守并发限制。支持直接向 fn 传递参数,减少不必要的闭包创建。
批量处理
limit.map(iterable, mapperFunction) 方法可以直接处理可迭代对象,对每个元素应用 mapperFunction,自动应用并发限制。
状态查询
通过 limit.activeCount 查看当前正在执行的任务数量,limit.pendingCount 查看等待执行的任务数量。
队列管理
调用 limit.clearQueue() 可以清空等待执行的任务队列,已经在执行的任务不受影响。
动态调整
通过 limit.concurrency 属性可以在运行时获取或修改并发限制。
函数级限流
limitFunction 导出可以为单个函数创建限流版本,控制该函数的同时执行次数,适合需要限制特定接口调用频率的场景。
其他说明
p-limit 专注于并发数量限制,功能设计简洁。如果需要更复杂的队列管理、暂停恢复等功能,可以使用同一作者的 p-queue 库。