如何在api调用nodejs的循环中实现多线程



在一个数组中有数千个文本对象。我想发送每个文本到一个API,并将结果保存到一个集合和更新另一个集合上成功的结果。

这是我的实现,
let arr = [
{
textId: "123",
text: "This is stackoverflow"
},
{
textId: "678",
text: "I love stackoverflow"
}
];
let textIds = [];
for(let i=0;i<arr.length;i++){
const result = await axios.post("API", {text:arr[i].text});
if(result && result.status === 200){
await db.collections("solutions").insertOne({...arr[i], result});
textIds.push(arr[i].textId);
}
}
await db.collections("texts").updateMany({textId:{"$in":textIds}},{"$set":{solutionFlag: true}});

当我迭代10k, 20k文本时,这会导致糟糕的性能。1万条短信大约需要1小时。我如何优化这段代码。worker_threads在这里起作用吗?

谢谢:)

在需要CPU密集型作业并发时使用Worker线程。这是IO密集型并发。因此,您可以通过使用普通的承诺来实现这一点。你应该收集这个调用返回的承诺,并像这样并发地运行它们:

const promises = arr.map(elem => axios.post("API", {text:elem.text}));
const results = Promises.all(promises);

产生这么多并发请求可能不是你想要的。在这种情况下,执行如下操作:

var textIds = [];
for (var i = 0; i < n/concurrency_factor; ++i) {
const promises = arr.slice(i*concurrency_factor, (i+1)*concurrency_factor);
const results = Promises.all(promises);
textIds = textIds.concat(results.map(res => res.id));
}

相关内容

  • 没有找到相关文章

最新更新