Node.js - Async.js:并行执行如何工作?

Posted

技术标签:

【中文标题】Node.js - Async.js:并行执行如何工作?【英文标题】:Node.js - Async.js: how does parallel execution work? 【发布时间】:2013-06-12 19:03:11 【问题描述】:

我想知道在 async.js 中并行执行是如何工作的

async = require('async')

async.parallel([
    function(callback)
        for (var i = 0; i < 1000000000; i++) /* Do nothing */;
        console.log("function: 1")
    ,
    function(callback)
        console.log("function: 2")
    
]);

在上面的例子中,我期望得到输出:

功能:2

功能:1

但是,控制台抛出了相反的情况,发生了什么?谢谢。

【问题讨论】:

async 库不会使任务/function 异步。它假定任务已经是异步的,并且只是帮助您跟踪其中的一组。而且,您的任务都不是异步的。 【参考方案1】:

您会得到意想不到的答案,因为async 首先启动function: 1,并且它不会将控制权释放回事件循环。 function: 1 中没有异步函数。

Node.js 是一个单线程异步服务器。如果你用一个长时间运行的 CPU 任务阻塞了事件循环,那么在你的长时间运行的 CPU 任务完成之前不能调用其他函数。

对于大的 for 循环,尝试发出 http 请求。比如……

async = require('async')
request = require('request')

async.parallel([
    function(callback)
      request("http://google.jp", function(err, response, body) 
        if(err)  console.log(err); callback(true); return; 
        console.log("function: 1")
        callback(false);
      );
    ,
    function(callback)
      request("http://google.com", function(err, response, body) 
        if(err)  console.log(err); callback(true); return; 
        console.log("function: 2")
        callback(false);
      );
    
]);

【讨论】:

在这个例子中,我将传回两个回调,那么它是如何工作的呢?一旦这两种情况发生,不应该有一个回调吗? 这只是一个同时发出两个请求的例子。输出到控制台。如果你想收集输出,你需要一个 final 函数。有关并行方法的更多详细信息,请查看异步文档。【参考方案2】:

Javascrit 是单线程的,除非您使用特殊的库/模块。因此,当您执行此代码时,它将执行第一个函数,然后执行第二个函数。

async.parallel 唯一要做的就是执行所有函数并等待所有响应,然后执行回调中的代码。

因为您使用的所有代码都是同步的,所以结果将是同步的。

【讨论】:

以上是关于Node.js - Async.js:并行执行如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Node.js 会以这种方式执行?

node.js async.js nextTick vs setImmediate

node.js async.js nextTick vs setImmediate

Async.js - 并行真的是并行的吗?

Async.js - 并行真的是并行的吗?

调试 node.js 脚本时,VSCode 在“async_hooks.js”上的不可见断点处停止