我正在尝试理解async
包与代码并行化相关的行为。根据我的理解,结构代码是有帮助的,以避免回调地狱/汤,但这是唯一的优势吗?
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
块将在十五秒后执行其最终回调,但知道“Node.js维护自己的内部线程池“,我们可以假设Node会在自己的线程中运行每个回调,真正并行化函数,并在5秒后调用最终回调吗?
答案 0 :(得分:1)
简短回答:您的代码需要15秒才能执行。为什么呢?
无法在 javascript中运行并行代码。在不阻塞事件循环的情况下运行同步代码的唯一方法是生成一个Worker。由于异步模块不关心工作者,因此必须等待您的函数在调用下一个函数之前完成。
请考虑以下事项:
sleep(5)
sleep(5);
sleep(5);
显然需要15秒。现在,即使你按照async的方式进行“并行”:
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");
});
代码立即执行,但只要事件循环产生那些排队的方法,它们就会阻止其他代码执行。