0

我有一个快递应用程序。我想为要运行的一组函数提供并行流程。我正在考虑使用异步模块来这样做。

我想知道是否有任何其他模块会比这更好?

其次我想知道这些功能是否必须是异步的?可以说我有这样的代码

var sum = function(x, y){
   return (x + y)
}

async.parallel([
    function(callback){
        setTimeout(function(){
            result = sum (x, y); //just an example for a synchronous function
            callback(null, result);
        }, 100);
    },
    function(callback){
        result = sum (x, y); //just an example for a synchronous function
        callback(null, result);
    }

],
// optional callback
function(err, results){
    console.log(result);
    // the results array will equal ['one','two'] even though
    // the second function had a shorter timeout.
});

所以你可以在里面有一些同步的功能。那么这两个仍然会并行运行吗?

我还听说在 node.js 中只有 I/O 任务可以并行运行,因为 node.js 是单线程的。这是真的吗?因此,如果我没有异步模块中的 I/O 任务,它们也不会并行运行,而只是出现?

请帮忙。

4

3 回答 3

2

Node.js 是单线程和(开箱即用)单核的

因此,在 Node.js 中没有什么是真正并行的,因为它是单线程的。

async.parallel方法仅在您的任务包含异步代码时才有用:它将等待所有响应,然后执行回调中的代码。 但是,如果您的任务仅包含同步代码,则结果将是同步的。

所以你最后一个问题的答案是肯定的。

如果您想尝试另一个控制流模块,请尝试Q。它实现了 Javascript Promises 并使异步代码更易于阅读和组织。

如果您想真正并行化您的任务,请查看子进程集群模块

还有一些特殊的本机模块,如Threads à gogo,它实现了线程。


您的代码的完整示例:

var async = require('async');

sum = function(x, y) {
  return (x + y)
}

x = 2;
y = 3;

async.parallel([
    function(callback) {
      setTimeout(function() {
        result = sum(x, y);
        console.log('f1');
        callback(null, result);
      }, 100);
    },
    function(callback) {
      result = sum(x, y);
      console.log('f2');
      callback(null, result);
    }

  ],

  function(err, results) {
    console.log(result);
  }
);

如果你运行这段代码,输出结果将永远是:f2, f1, 5. 这是因为setTimeout在第一个函数中,但是代码的执行方式是同步的。

如果您想被说服,请删除第一个函数中的 setTimeout 并查看输出将始终f1, f2, 5.

所以:

  • 如果您想同时运行两个 HTTP 请求(它们是异步的)并等待它们都完成,async.parallel 非常有用。

  • 如果将同步代码放入其中,async.parallel 将没有用,因为代码将以同步方式执行。

于 2013-07-14T19:13:31.537 回答
1

async 是这类任务的事实上的模块,随它去吧。

不,这些函数不是必须是异步的。我相信你所有的问题都可以用这个来回答:http: //blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/,以下是重点:

Node.js 为您的代码保留一个线程,但是,除了您的代码之外,所有内容都是并行运行的。

于 2013-07-14T18:57:50.123 回答
0

另一种方法是使用 promise (bluebird)。请参阅此处的文档和示例用法http://bluebirdjs.com/docs/getting-started.html)。

例如,

function f1() {... }
function f2() {... }
function f3() {... }

Promise.all[f1(), f2(), f3()] // run all functions parallel
  .then(() => { /*do something*/})
  .catch(err => { /*handle error*/ })
于 2016-06-20T10:44:08.137 回答