异步混淆了并行功能

时间:2013-07-24 13:32:01

标签: node.js

我尝试理解并在节点中使用异步库。我真的不明白,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吗?如果不是,那个名字并行表达了什么?

1 个答案:

答案 0 :(得分:7)

通过将这些函数放置在传递给并行的数组中,可以保证数组中结果的位置。请注意,传递给parallel的函数必须使用相同的参数。将这些函数放在包装器中,然后像这样调用

someArrayOfFunctions[index](arguments);

使用此方法,异步gaurantees独立于并行中的函数何时完成,结果按照预期的顺序放置在数组中,通过使用回调来填充结果,基于索引。具体实现并不重要,事实是无论何时完成,相应运行的结果将根据其功能在阵列中的位置而不是基于时序而最终放置。

根据您的第二个问题,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后端内。提供此并行性的唯一方法是发布备用版本的节点或开发本机扩展。