什么是并行执行(显式和隐式)以及node.js中的顺序执行?

时间:2012-11-23 13:15:16

标签: node.js event-handling parallel-processing promise

此示例混淆了我对node.js如何工作的理解:

// 1.
numbers.forEach(function(number) {
  queue.push(Q.call(slowFunction, this, number));
});

// 2.
// Q.all: execute an array of 'promises' and 'then' call either a resolve 
// callback (fulfilled promises) or reject callback (rejected promises)
Q.all(queue).then(function(ful) {

  // All the results from Q.all are on the argument as an array
  console.log('fulfilled', ful);
}, function(rej) {

  // The first rejected (error thrown) will be here only
  console.log('rejected', rej);
}).fail(function(err) {

  // If something went wrong, then we catch it here, usually when there is no
  // rejected callback.
  console.log('fail', err);
}).fin(function() {

  // Finally statement; executed no matter of the above results
  console.log('finally');
});

为什么假设这样,1.2.部分代码将按顺序执行? 那么,Q.all(queue)queue中推送的所有1.元素的保证在哪里?可能是这样,来自numbers的{​​{1}}是如此之大,以至于它与1.并行吗? 这些想法来自于node.js将首先使用2.处理1.2.,然后将其提供给node.js event-loop,这实际上类似于普通线程。

所以问题 - 将workers1.相互并行执行,从2.开始顺序执行,或者按顺序执行(node.js event-loop推送所有元素在队列中,只有在1.开始处理2.中的每个元素之后? 请提供有关此主题文档的一些直接链接的参数。

1 个答案:

答案 0 :(得分:1)

在最顶层,1和2的Q.all(queue).then(...).fail(...).fin(...);方法链将明确地按顺序执行。

在1和2中定义/调用的函数的精确执行时间在很大程度上取决于slowFunction的性质。

  • 如果slowFunction完全由同步javascript执行(例如,一些广泛的数学),那么1将在2开始之前完整地完成。在这种情况下,2中指定的回调将在2的方法链完成执行后很快执行,因为slowfunction返回的任何承诺将(或者至少应该)已经解决。

  • 但是,如果slowFunction涉及一个或多个异步节点I / O进程(例如文件处理或资源提取),则每次调用它将(至少部分)由一个非阻塞工作线程(不是javascript);在这种情况下,正确写入slowFunctionqueue将累积一组承诺,每个承诺将在以后解决或拒绝。 2中指定的回调将在2的方法链完成执行后执行,并且所有承诺都已被解决或拒绝。

对我来说,2的介绍性文本的重新版本将大大有助于解释执行的顺序:

  

Q.all:等待queue数组中的每个“承诺”   已解决或拒绝'然后'调用相应的回调函数。

参考:http://rickgaribay.net/archive/2012/01/28/node-is-not-single-threaded.aspx