2

我试图了解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 是单线程的” ,我们认为该async块将在 15 秒后执行其最终回调,但是知道“Node.js 维护自己的内部线程池”,我们可以假设Node 会在自己的线程中运行每个回调,真正并行化函数,并在 5 秒后调用最终回调?

4

1 回答 1

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

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

于 2013-08-11T20:32:21.033 回答