Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在node.js中分叉循环的正确方法是什么_Node.js_For Loop_Fork - Fatal编程技术网

在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限制。因此,正确的方法是异步处理它。不需要多线程。在答案中说出来!