强力推荐:async-sema - 高效的异步信号量库
async-sema 是一个专为异步编程和async/await
设计的信号量实现。与JavaScript社区中常见的异步信号量定义不同,它允许指定数量的任务并发执行,其余任务将等待。这个设计使得资源管理更为精确,特别适合于控制并发访问。
项目简介
async-sema 采用了一种与众不同的方式管理信号量计数,将其表示为令牌列表,而不是单一的可用资源变量。通过在构造函数中提供初始化函数选项,可以将实际资源与信号量对象紧密结合起来。在examples/pooling.js
示例中,你可以看到如何使用自定义令牌初始化器。
使用方法
要在项目中使用 async-sema,只需运行以下命令:
npm install --save async-sema
或者
yarn add async-sema
之后就可以按照提供的例子进行调用了。
示例代码
下面是一个基本使用示例:
const { Sema } = require('async-sema');
const s = new Sema(
4, // 允许4个并发的异步请求
{
capacity: 100 // 预分配100个令牌
}
);
async function fetchData(x) {
await s.acquire();
try {
console.log(s.nrWaiting() + ' 个fetch请求正在等待');
// ... 执行异步操作
} finally {
s.release();
}
}
const data = await Promise.all(array.map(fetchData));
此外,async-sema 还提供了简单的速率限制器功能:
const { RateLimit } = require('async-sema');
async function f() {
const lim = RateLimit(5); // 每秒5次
for (let i = 0; i < n; i++) {
await lim();
// ... 执行异步操作
}
}
API 简介
Sema 构造函数接受两个参数,第一个是并发数,第二个是可选配置。提供了诸如 drain()
(清空并返回所有令牌)、nrWaiting()
(返回等待队列中的请求数量)以及 acquire()
和 release()
方法用于获取和释放信号量。
另外还有 RateLimit
函数,用于创建限速器,你可以设置每秒钟的请求次数,并选择是否启用时间窗口内的均匀分布。
开源贡献
如果你对项目感兴趣,欢迎参与贡献。只需fork项目,本地克隆,然后将它链接到你的Node.js全局模块目录即可。
作者
本项目由 Olli Vanhoja 创建,你可以在Twitter上关注他:@OVanhoja。
结论
async-sema 提供了一个强大且灵活的工具,用于精细控制异步任务的并发性和速率限制。无论是在高并发场景下的数据处理,还是需要精确控制服务请求速率的API应用,这个库都能为你带来显著的优势。立即试用,看看它如何提升你的项目性能吧!