首页 > 解决方案 > 池请求与批处理请求

问题描述

我试图了解异步库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));
}

上述方法是否做同样的事情?

谢谢。

标签: javascriptnode.jsasync-await

解决方案


批处理确实会创建多达 20 个并发请求的“峰值”,但会在开始下一个批处理之前等待当前批处理的所有请求。因此,如果 20 个中的 1 个需要很长时间,它将只有那个运行。

相比之下,诸如mapLimit开始 20 个请求的解决方案,然后为每个完成的请求增加 1 个,因此总是同时有 20 个请求在进行中。


推荐阅读