因此,我创建了一个服务器,它收集数据并在永续循环中将其写入db。
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
}问题是整个循环花费了太多的时间。所以我想通过多线程循环来加快速度,并使用我所有的计算机核心。
我怎么发动汽车呢?
https://nodejs.org/docs/latest/api/cluster.html上有带有示例的集群库,但我不想创建新的服务器。我想生孩子,他们完成任务后就退出了。
所以有const { fork } = require('child_process');,但我不太清楚如何使每个叉只运行collectProjectData()方法。
发布于 2018-03-13 13:32:57
您可以在不使用任何第三方库的情况下进行本机操作。现在,您的for...loop正在一个接一个地运行。
备选案文1
使用Promise.all和.map
await Promise.all(projectNames.map(async(projectName) => {
await collectProjectData(projectName);
});请注意,如果您使用.map,它将同时启动所有这些功能,如果projectNames继续增长,这可能会太多。这与你目前所做的完全相反。
选项2
有一个中间的way...running批按顺序排列,但是每个批中的项是异步的。
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);
});
}发布于 2018-03-13 13:23:25
我建议使用Promise.map http://bluebirdjs.com/docs/api/promise.map.html
这样,您就可以像这样控制并发级别:
await Promise.map(projectNames, collectProjectData, {concurrency: 3})https://stackoverflow.com/questions/49257083
复制相似问题