gpt4 book ai didi

node.js - async.parallel 是否也并行化阻塞代码?

转载 作者:太空宇宙 更新时间:2023-11-03 22:17:53 25 4
gpt4 key购买 nike

我正在尝试了解 async 的行为与代码并行化相关的包。据我了解,构建代码以避免回调 hell /汤是有帮助的,但这是唯一的优点吗?

async.parallel([
function(next) {
apiCallTo3rdParty(next);
},
function(next) {
apiCallTo3rdParty(next);
},
function(next) {
apiCallTo3rdParty(next);
}
], function(err, res) {
// do something else with returned data
});

在上面的代码中,将进行所有三个 API 调用,而无需等待另一个调用完成。根据规范。最终的回调将在最长的 API 调用返回后调用,因为其余的调用将在之前完成。

但是,如果我更改代码以使其执行几个阻塞操作,会发生什么?:

async.parallel([
function(next) {
sleep(5);
},
function(next) {
sleep(5);
},
function(next) {
sleep(5);
}
], function(err, res) {
// do something else with returned data
});

服用"Node.js is Single Threaded"从表面上看,我们认为 async block 将在 15 秒后执行其最终回调,但知道“Node.js 维护自己的内部线程池”,我们是否可以假设Node 将在自己的线程中运行每个回调,真正并行化函数,并在 5 秒后调用最终回调?

最佳答案

简短回答:您的代码需要 15 秒才能执行。为什么?

无法在 JavaScript 中运行并行代码。在不阻塞事件循环的情况下运行同步代码的唯一方法是生成一个 Worker。由于异步模块不关心工作线程,因此它必须等待您的函数完成才能调用下一个函数。

考虑以下因素:

sleep(5)
sleep(5);
sleep(5);

显然需要 15 秒。现在,即使您按照异步的方式使其“并行”:

function parallel () {
process.nextTick(function(){
sleep(5);
});
process.nextTick(function(){
sleep(5);
});
}
parallel();
console.log("this is called immediately");

process.nextTick(function(){
console.log("this is called 10 secs later");
});

代码会立即执行,但是一旦事件循环屈服于那些排队的方法,它们就会阻止其他代码的执行。

关于node.js - async.parallel 是否也并行化阻塞代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18175538/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com