2013-07-14 87 views
0

我有一个快速应用程序。我想为我想运行的一组函数创建并行流。我正在考虑使用async模块。节点模块中的并行流程

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

其次我想知道是否有必要将这些函数设置为异步?可以说我有这样的

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任务,它们也不会并行运行,而只是看起来像?

请帮忙。

回答

1

异步是这些类型的任务的事实上的模块,与它同行。

不,这些功能不是强制性的异步。我相信所有的问题可以用这个来回答:http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/,其中,以下是重要的一点:

的Node.js保持一个单线程代码然而,一切都运行 并行除了你的代码。

+0

你肯定他们并不需要是同步的?其次,非I/O也可以并行工作或者像这样工作。正如很多人告诉我的,由于node.js在单线程中运行是不可能的,并且实现它必须产生子进程。那么异步使用子进程是否一样? –

+0

当两个函数都完成了他们的工作(即他们调用它们的回调函数)时,将调用'async.parallel'的回调函数,这与所涉及函数的性​​质无关。不,异步不会产生流程来实现这一点,阅读链接,只是'async.parallel'来得到一个确切的想法。 –

+0

是的,我经历了两次,但无法找到一个如何async.parallel达到这个答案?所以很想知道它是如何做到的? –

2
Node.js的

单线程和(开箱)单核

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

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

所以最后一个问题的答案是

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

如果您想真正并行化您的任务,请参阅child processcluster module

还有一些特殊的本地模块,如​​它实现了线程。


与您的代码完整的示例:

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无用。

+0

我已经列出了我要在问题中运行的代码。看看它,让我知道如果这些可以并行模式运行。就我看来,它们是异步的,但它们内部具有同步功能。所以请回答一下,如果这些可以并行运行。 –

+0

我上面编辑了我的答案并添加了一个代码示例 – xmikex83

0

另一种方法是使用诺言(蓝鸟)。 请参阅文档和样例用法,在这里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*/ })