在node.js中分叉循环的正确方法是什么
所以我创建了一个服务器,它收集数据,并以永无止境的循环将数据写入数据库在node.js中分叉循环的正确方法是什么,node.js,for-loop,fork,Node.js,For Loop,Fork,所以我创建了一个服务器,它收集数据,并以永无止境的循环将数据写入数据库 server.listen(3001, () => { doFullScan(); }); async function doFullScan() { while (true) { await collectAllData(); } } collectAllData()是一种检查可用项目、循环每个项目、收集一些数据并将其写入数据库的方法 async function collectA
server.listen(3001, () => {
doFullScan();
});
async function doFullScan() {
while (true) {
await collectAllData();
}
}
collectAllData()
是一种检查可用项目、循环每个项目、收集一些数据并将其写入数据库的方法
async function collectAllData() {
//doing soemhting
const projectNames = ['array with projects name'];
//this loop takes too much of time
for(let project in projectNames){
await collectProjectData(project);
}
//doing something
}
问题是整个循环占用了太多的时间。所以我想通过多线程循环来加速它,并在它上面使用我所有的计算机内核
我该怎么做
有一个带有示例的集群库,但我不想创建新的服务器。我想要产生孩子,他们将完成一项任务并在完成任务后退出
因此有
const{fork}=require('child_process')
但我不确定如何使每个fork只运行collectProjectData()
方法。我建议使用Promise.map
这样,您就可以控制并发级别,如下所示:
await Promise.map(projectNames, collectProjectData, {concurrency: 3})
您可以在没有任何第三方库的情况下以本机方式完成此操作。 现在,您的
for…循环正在一个接一个地运行
选择1
使用Promise.all
和.map
await Promise.all(projectNames.map(async(projectName) => {
await collectProjectData(projectName);
});
注意,如果您使用.map
,它将同时启动所有项目,如果projectNames
继续增长,这可能会太多。
这与你目前所做的完全相反
选择2
有一种中间方法…按顺序运行批,但异步运行每个批中的项
const chunk = (a, l) => a.length === 0 ? [] : [a.slice(0, l)].concat(chunk(a.slice(l), l));
const batchSize = 10;
const projectNames = ['array with projects name'];
let projectNamesInChunks = chunk(projectNames, batchSize);
for(let chunk of projectNamesInChunks){
await Promise.all(chunk.map(async(projectName) => {
await collectProjectData(projectName);
});
}
与其一个接一个地等待collectProjectData
,您还可以使用Promise.all
?这根本不是多线程的。根据设计,node.js进程是单线程的。这是异步的。@ShioT很好的观点,非常正确。因为它是设计的,所以很难正确地执行多线程。最简单的方法是让运行服务的多个实例共享工作负载,在这种情况下,这可能不是最好的解决方案。然而,NodeJS完全支持异步操作,这在大多数情况下不需要额外的线程。我认为OP的主要问题是他/她的代码太慢,他们只是碰巧得出结论,多线程将解决这个问题。异步操作非常适合这个用例。如果多线程根本不能解决这个问题,我认为OP也不想这样做。你的意思是OP正在寻找一个不存在的解决方案,同时给他们提供一些对OP或回答问题没有帮助的其他解决方案。这根本不是多线程的。根据设计,node.js进程是单线程的。这只是异步的。“collectProjectData”正在与数据库交互,并且不受cpu限制。因此,正确的方法是异步处理它。不需要多线程。在答案中说出来!