首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在node.js中如何正确地分叉循环?

在node.js中如何正确地分叉循环?
EN

Stack Overflow用户
提问于 2018-03-13 13:09:55
回答 2查看 686关注 0票数 0

因此,我创建了一个服务器,它收集数据并在永续循环中将其写入db。

代码语言:javascript
复制
server.listen(3001, () => {
doFullScan();
});

async function doFullScan() {
    while (true) {
        await collectAllData();
    }
}

collectAllData()是一种检查可用项目、循环遍历每个项目、收集数据并将其写入数据库的方法。

代码语言:javascript
复制
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
}

问题是整个循环花费了太多的时间。所以我想通过多线程循环来加快速度,并使用我所有的计算机核心。

我怎么发动汽车呢?

https://nodejs.org/docs/latest/api/cluster.html上有带有示例的集群库,但我不想创建新的服务器。我想生孩子,他们完成任务后就退出了。

所以有const { fork } = require('child_process');,但我不太清楚如何使每个叉只运行collectProjectData()方法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-13 13:32:57

您可以在不使用任何第三方库的情况下进行本机操作。现在,您的for...loop正在一个接一个地运行。

备选案文1

使用Promise.all.map

代码语言:javascript
复制
await Promise.all(projectNames.map(async(projectName) => {
  await collectProjectData(projectName);
});

请注意,如果您使用.map,它将同时启动所有这些功能,如果projectNames继续增长,这可能会太多。这与你目前所做的完全相反。

选项2

有一个中间的way...running批按顺序排列,但是每个批中的项是异步的。

代码语言:javascript
复制
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);
  });
}
票数 1
EN

Stack Overflow用户

发布于 2018-03-13 13:23:25

我建议使用Promise.map http://bluebirdjs.com/docs/api/promise.map.html

这样,您就可以像这样控制并发级别:

代码语言:javascript
复制
await Promise.map(projectNames, collectProjectData, {concurrency: 3})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49257083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档