async.parallel是否也会阻塞代码?

我试图理解async包在代码并行化方面的行为。 据我所知,为了避免callback地狱/汤,结构代码是有帮助的,但这是唯一的优势吗?

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

在上面的代码中,所有三个API调用都将在不等待另一个完成的情况下进行。 根据规格。 最后的callback将在最长的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是单线程”的面值,我们认为async块会在15秒后执行最后一次callback,但是知道“Node.js维护自己的内部线程池”假设Node会在自己的线程中运行每个callback,真正平行的function,并在5秒后调用最后的callback?

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

没有办法 javascript中运行并行代码。 运行同步代码而不阻塞事件循环的唯一方法是产生一个Worker。 由于asynchronous模块不关心工作人员,因此必须等待您的function完成才能调用下一个function。

考虑以下:

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

显然这将需要15秒。 现在,即使您以asynchronous方式进行“并行”

 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"); }); 

该代码立即执行,但只要事件循环产生到排队的方法,他们将阻止其他代码执行。