async.parallel还能并行阻塞代码吗?

时间:2013-08-11 18:56:05

标签: node.js parallel-processing node-async

我正在尝试理解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秒后调用最终回调吗?

1 个答案:

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

代码立即执行,但只要事件循环产生那些排队的方法,它们就会阻止其他代码执行。