1

我尝试理解和使用节点中的异步库。我真的不明白, async.parallel 函数是如何工作的。并行名称似乎类似于多线程,请考虑以下示例:

async.parallel([
    function(callback){
        setTimeout(function(){
            console.log('1');
            callback(null, 'one');
        }, 200);
    },
    function(callback){
        setTimeout(function(){
            console.log('2');
            callback(null, 'two');
        }, 100);
    }
],
// optional callback
function(err, results){
    if(err){
        console.log('Error');
    } else {
        console.log(results);
    }
    // the results array will equal ['one','two'] even though
    // the second function had a shorter timeout.
});

我得到了结果

[ 'one', 'two' ]  

async.parallel 在多线程上执行吗?如果不是,平行快递叫什么名字?

4

1 回答 1

7

数组中结果的放置由您在传递给并行的数组中放置这些函数来保证。请注意,您传递给并行的函数必须采用相同的参数。想象这些函数被放置在一个包装器中,然后像这样调用

someArrayOfFunctions[index](arguments);

使用此方法,异步保证独立于并行中的函数何时完成,通过使用回调来根据索引填充结果,结果按预期顺序放置在数组中。具体实现无关紧要,事实是无论何时完成,各个运行的结果最终都会根据其函数在数组中的位置放置,而不是基于时间。

根据您的第二个问题, async.parallel 是否真正并行。它不是。请参考以下示例:

var async = require('async');

async.parallel([
    function(callback){
        while(true);//blocking!
    },
    function(callback){
        console.log('Not Blocked');//Never get's called
    }
]);

第二个函数永远不会被调用。异步提供的并行性会有所帮助,这正是您对示例感到困惑的原因。异步代码的问题在于,有时我们对节点中实际并行的事情(磁盘 I/O、网络 I/O 等)有一些回调需要完成,但最终会完成以不可预知的间隔。例如,我们有要从多个来源收集的配置数据,并且没有提供同步方法。我们不想连续运行这些,因为这会大大减慢速度,但我们仍然希望按顺序收集结果。这是使用 async.parallel 的主要示例。但是,不,async.parallel 不能使同步代码异步执行,正如这个阻塞示例所示。

节点中的真正并行性来自 V8 后端。提供这种并行性的唯一方法是发布节点的替代版本或开发本机扩展。

于 2013-07-24T13:55:45.820 回答