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 async.js nextTick vs setImmediate