Node.js 节点模块中的并行流
我有一个快速应用程序。我想为我想要运行的一系列函数提供并行流。我正在考虑使用模块来实现这一点 我想知道是否还有其他模块比这个更好 其次,我想知道这些函数是否必须是异步的?假设我有这样的代码Node.js 节点模块中的并行流,node.js,asynchronous,express,node-async,Node.js,Asynchronous,Express,Node Async,我有一个快速应用程序。我想为我想要运行的一系列函数提供并行流。我正在考虑使用模块来实现这一点 我想知道是否还有其他模块比这个更好 其次,我想知道这些函数是否必须是异步的?假设我有这样的代码 var sum = function(x, y){ return (x + y) } async.parallel([ function(callback){ setTimeout(function(){ result = sum (x, y); //j
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任务,那个么它们也不会并行运行,而只是看起来是
请提供帮助。异步是此类任务的实际模块,随它去吧 不,这些函数不一定是异步的。我相信你所有的问题都可以这样回答:,以下是重点: js为您的代码保留一个线程,但是,一切都在运行 除了你的代码之外,其他都是并行的
async实际上是这类任务的模块,随它去吧 不,这些函数不一定是异步的。我相信你所有的问题都可以这样回答:,以下是重点: js为您的代码保留一个线程,但是,一切都在运行 除了你的代码之外,其他都是并行的
Node.js是单线程和(开箱即用)单核 因此,Node.js中没有什么是真正的并行的,因为它是单线程的 只有当任务包含异步代码时,
async.parallel
方法才有用:它将等待所有响应,然后在回调中执行代码。
但是如果任务只包含同步代码,则结果将是同步的
因此,您最后一个问题的答案是是
如果要尝试其他控制流模块,请尝试。它实现了Javascript承诺,使异步代码更易于阅读和组织
如果您想真正并行化您的任务,请查看或
还有一些特殊的本机模块,它们实现线程
代码的完整示例:
var async=require('async');
总和=函数(x,y){
返回(x+y)
}
x=2;
y=3;
异步并行([
函数(回调){
setTimeout(函数(){
结果=总和(x,y);
console.log('f1');
回调(null,result);
}, 100);
},
函数(回调){
结果=总和(x,y);
console.log('f2');
回调(null,result);
}
],
功能(错误、结果){
控制台日志(结果);
}
);
如果运行这段代码,输出结果将始终为:f2、f1、5
。这是因为第一个函数中的setTimeout
,但代码的执行方式是同步的
如果您想确信,请删除第一个函数中的setTimeout,并查看输出将始终为f1、f2、5
因此:
- 如果要同时运行两个HTTP请求(异步),并等待两个请求都完成,则async.parallel非常有用
- 如果将同步代码放入async.parallel中,则该代码将不起作用,因为代码将以同步方式执行
- 如果要同时运行两个HTTP请求(异步),并等待两个请求都完成,则async.parallel非常有用
- 如果将同步代码放入async.parallel中,则该代码将不起作用,因为代码将以同步方式执行
- Node.js是单线程的和(开箱即用的)单核的
因此,Node.js中没有什么是真正的并行的,因为它是单线程的
只有当任务包含异步代码时,
async.parallel
方法才有用:它将等待所有响应,然后在回调中执行代码。
但是如果任务只包含同步代码,则结果将是同步的
因此,您最后一个问题的答案是是
如果要尝试其他控制流模块,请尝试。它实现了Javascript承诺,使异步代码更易于阅读和组织
如果您想真正并行化您的任务,请查看或
还有一些特殊的本机模块,它们实现线程
代码的完整示例:
var async=require('async');
总和=函数(x,y){
返回(x+y)
}
x=2;
y=3;
异步并行([
函数(回调){
setTimeout(函数(){
结果=总和(x,y);
console.log('f1');
回调(null,result);
}, 100);
},
函数(回调){
结果=总和(x,y);
console.log('f2');
回调(null,result);
}
],
功能(错误、结果){
控制台日志(结果);
}
);
如果运行这段代码,输出结果将始终为:f2、f1、5
。这是因为第一个函数中的setTimeout
,但代码的执行方式是同步的
如果您想确信,请删除第一个函数中的setTimeout,并查看输出将始终为f1、f2、5
因此:
- 另一种方法是使用promise(蓝鸟)。
请参见此处的文档和示例用法)
e、 g
另一种方法是使用promise(蓝鸟)。 请参见此处的文档和示例用法) e、 g
您确定它们不需要同步吗?第二,非I/O也会并行工作,或者像这样工作。正如许多人告诉我的那样,由于node.js是在单线程中运行的,所以不可能实现它,而要实现它,必须生成子进程。异步使用ch也是如此
function f1() {... }
function f2() {... }
function f3() {... }
Promise.all[f1(), f2(), f3()] // run all functions parallel
.then(() => { /*do something*/})
.catch(err => { /*handle error*/ })