使用aync库,是否可以在不使用预构建的异步i / o函数的情况下创建真正的异步任务?
例如,如果运行此代码,它将始终按顺序运行函数,因为node.js是"单线程"。
var async = require('async');
async.parallel([
function(){
console.log('1')
},
function(){
console.log('2')
},
function(){
console.log('3')
},
function(){
console.log('4')
}
]);
我们不应该阻止节点 - 是 - 但node.js在单核上运行。如果我们想利用其他核心,我们可以产生进程并使用异步库以这种方式产生良好效果。
除群集模块外,是否有在其他核心上生成异步进程的最佳实践方法?
答案 0 :(得分:2)
您可以使用类似 - https://github.com/rvagg/node-worker-farm的内容在子进程内运行任务。
答案 1 :(得分:1)
好的,我找到了一个很好的解决方案。对于最简单的情况,我们使用核心模块' child_process'。你甚至不必运行npm install来使用这个模块,它是一个核心模块。
为了解决这个问题,我使用了这里的信息:
http://blog.carbonfive.com/2014/02/28/taking-advantage-of-multi-processor-environments-in-node-js/
https://nodejs.org/api/child_process.html
//main.js
var cp = require('child_process');
var async = require('async');
async.parallel([
function one(callback){
console.log('1');
var k = cp.fork('./doOther.js',['01']);
k.once('message',function(msg){
console.log(msg);
callback();
});
},
function two(callback){
console.log('2');
var k = cp.fork('./doOther.js',['02']);
k.once('message',function(msg){
console.log(msg);
callback();
});
},
function three(callback){
console.log('3');
var k = cp.fork('./doOther.js',['03']);
k.once('message',function(msg){
console.log(msg);
callback();
});
},
function four(callback){
console.log('4');
var k = cp.fork('./doOther.js',['04']);
k.once('message',function(msg){
console.log(msg);
callback();
});
}
],function(){
console.log('done.');
process.exit(0);
});
同一目录中的单独文件:
//doOther.js
process.on('message', function(msg) {
console.log('child process got message:', msg);
});
setTimeout(function(){
process.send({ foo: process.argv[2] });
},1000);
将这两个文件放在同一目录中,然后离开。随意问任何问题。我会回复。
以上内容可以简化为:
async.parallel([1,2,3,4].map(function(val){
return function(cb){
console.log(val);
var k = cp.fork('./other-script.js',[val]);
k.once('message',function(msg){
console.log(msg);
cb(null, msg);
});
},
}),
function(err, results){
console.log('done.');
process.exit(0);
});