并行运行异步代码

时间:2015-05-28 01:02:13

标签: javascript node.js multithreading asynchronous

使用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在单核上运行。如果我们想利用其他核心,我们可以产生进程并使用异步库以这种方式产生良好效果。

除群集模块外,是否有在其他核心上生成异步进程的最佳实践方法?

2 个答案:

答案 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);

    });