javascript - 池请求与批处理请求
问题描述
我试图了解异步库mapLimit/queue
方法和这个aysnc/await
批处理请求函数之间的区别。
对于此示例,假设 API 的限制为每秒 20 个请求。我正在使用这个脚本。我的意图是同时执行每秒允许的最大请求。
我用这个脚本实现了吗?
const data = Array(200).fill('');
const concurrent = 20;
let requests = 0;
const start = new Date();
(async () => {
while (data.length) {
// Batched concurret request per second
await new Promise((resolve) => setTimeout(resolve, 1000));
const batch = data.splice(0, concurrent).map(API);
const results = await Promise.allSettled(batch);
// For testing
const timeTotal = Math.round((requests / (new Date() - start)) * 1000);
console.log(`Requests per second (total): ${timeTotal}/${data.length}`);
// Deal with errors
for (const { status, reason } of results) {
if (status === 'rejected') {
console.error(`There was an error ${reason}`);
}
}
}
})()
async function API() {
requests++;
await new Promise((resolve) => setTimeout(resolve, 0));
}
上述方法是否做同样的事情?
谢谢。
解决方案
批处理确实会创建多达 20 个并发请求的“峰值”,但会在开始下一个批处理之前等待当前批处理的所有请求。因此,如果 20 个中的 1 个需要很长时间,它将只有那个运行。
相比之下,诸如mapLimit
开始 20 个请求的解决方案,然后为每个完成的请求增加 1 个,因此总是同时有 20 个请求在进行中。
推荐阅读
- r - R:如何从列中提取特定值到新列中?
- google-apps-script - 新文档上未触发主页触发器(添加 Google 工作区)
- apache-kafka - 如何理解 Kafka HA?
- nginx - 您如何将 NGINX 指向多个站点的标准 PHP?
- docker - Kubernetes 服务:随机连接被拒绝
- database - typeorm 中的复杂查询
- python - 使用 dask 作为并行后端时的问题
- string - VIsual Basic Strings.Trim(String) 方法和 .NET String.Trim 方法有区别吗?
- php - 使用通配符键从数组中提取键和值
- ansible - Ansible 不接受客户失败模块