asynchronous混淆了并行function

我尝试了解和使用节点中的asynchronous库。 我真的不明白,async.parallelfunction如何工作。 对于像multithreading似乎并行的名称,请考虑以下示例:

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上执行multithreading吗? 如果不是,那么平行表示的名字是什么?

数组中的结果放置是通过将这些函数放置在并行传递的数组中的方式来确定的。 请注意,您传递给并行的函数必须采用相同的参数。 把这些函数放在一个包装器中,然后像这样调用

 someArrayOfFunctions[index](arguments); 

使用这种方法,asynchronousgaurantees与平行内函数完成无关,结果将按照预期的顺序放置在数组中,通过使用callback来填充结果,基于索引。 具体的实现并不重要,事实上不pipe你什么时候完成,各个运行的结果都会根据它们的function在哪里,而不是根据时间来结束。

根据你的第二个问题,async.parallel是否真正平行。 不是这样。 参考下面的例子:

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

第二个函数永远不会被调用。 asynchronous提供的并行帮助,正是你对你的例子感到困惑的原因。 asynchronous代码的问题是,有时候我们有一些callback事件,这些callback事件在节点(磁盘I / O,networkingI / O等等)中实际是并行的,但是最终会完成在不可预知的时间间隔。 比方说,我们有configuration数据从多个来源收集,并没有提供同步方法。 我们不希望连续执行这些操作,因为这会大大降低速度,但我们仍然希望按顺序收集结果。 这是async.parallel的主要用例。 但是,不,async.parallel不能使asynchronous代码asynchronous执行,如此阻塞示例所示。

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