限制javascript节点js中的并发性

限制javascript节点js中的并发性,javascript,node.js,concurrency,Javascript,Node.js,Concurrency,我有以下代码: const rl = require('readline').createInterface({ input: require('fs').createReadStream(__dirname + '/../resources/profiles.txt'), terminal: true }); for await (const line of rl) { scrape_profile(line) } s

我有以下代码:

const rl = require('readline').createInterface({
        input: require('fs').createReadStream(__dirname + '/../resources/profiles.txt'),
        terminal: true
    });

    for await (const line of rl) {
        scrape_profile(line)
    }

scrape_profile是一个向web发出一些请求并执行一些处理的函数。现在的问题是,我想限制每30秒执行5个scrape_配置文件。。到目前为止,如果我有一个1000行的文本文件,它将继续执行,一次执行1000个并发请求。。如何限制这一点?

我不太清楚,如果您同时将整个文件异步读取到内存中,为什么要使用
readlineInterface
,因此我的答案是,我将其替换为调用
fs.readFileSync
,因为处理有限值比处理流容易得多,而且问题没有明确说明需要流式处理的文件IO

您可以尝试使用:

const fs=require('fs');
const lines=fs.readFileSync('./test.txt').toString().split('\r\n');
const Promise=require(‘蓝鸟’);
常数=5;
const scrape_profile=文件=>新承诺((解决、拒绝)=>{
设置超时(()=>{
log(“完成”,文件);
解析(Math.random());
},Math.random()*1000);
});
const runBatch=batchNo=>{
常量batchSize=数学圆(lines.length/批次);
const start=batchSize*batchNo;
const end=batchSize*(batchNo+1);
常数索引=开始;
返回承诺.减少(行.切片(开始,结束),(聚合,行)=>{
log({aggregate});
返回刮削剖面(线)
。然后(结果=>{
聚合。推送(结果);
总回报;
});
}, []);
}
运行批处理(0)。然后(/*批处理1完成*/)
运行批处理(1)。然后(/*批处理2完成*/)
运行批处理(2)。然后(/*批处理3完成*/)
运行批处理(3)。然后(/*批处理4完成*/)
运行批处理(4)。然后(/*批处理5完成*/)
// ... 最好使用for循环来执行此操作

这是一个完整的例子;您应该能够在本地运行此程序(使用一个名为“test.txt”的文件,该文件包含任何内容),对于每一行,它将花费随机时间生成一个随机数;它运行5个单独的批次。您需要更改
批次的值
以反映所需的批次数

您可以使用setinterval 30秒来执行5次刮除配置文件循环,您的循环使用的行数与您指定的1000行相同,不停止,然后做5次循环,并将其放入一个用setinterval调用的函数中,当然,也要将当前行的索引作为一个变量,以便从停止的地方继续