Node.js多历程

Node.js多历程
Node.js单线程情势运转的,运用事宜处置惩罚并发。

exec()

运用子历程的实行敕令,缓存子历程的输出。并将子历程的输出以回调函数参数的情势举行返回

process.argv()

当参数为0时

是node的文件相对地点

当参数为1时

是该文件的相对地点

当参数为2时

是敕令第一个参数。

child_process.exec

回调函数有三个选项,error, stdout, stderr
error 为递次实行的毛病,一般实行会返回一个null
stdout 为递次的一般输出
stderr 为递次毛病输出

/*master.js*/
const fs = require('fs');
const child_process = require('child_process');
 
for(var i=0; i<3; i++) {
    var count = 0;
    var workerProcess = child_process.exec('node support.js ' +i, function (err, std, stderr) {
        if (err) {
            console.log(err.stack);
            console.log('Error code: '+err.code);
            console.log('Signal received: '+err.signal);
        }
        console.log('---------------------');
        console.log(i);
        console.log('stdout: ' + std);
        console.log('stderr: ' + stderr);
    });
 
    workerProcess.on('exit', function (code) {
        console.log('子历程已退出,退出码 '+code);
        console.log('实行递次' + count++);
    });
}
/*support.js*/
/*support.js*/
console.log("历程 " + process.argv[2] + " 实行。" );

实行效果

PS C:\Users\mingm\Desktop\test> node master.js
子历程已退出,退出码 0
实行递次0
---------------------
3
stdout: 历程 0 实行。

stderr:
子历程已退出,退出码 0
实行递次1
---------------------
3
stdout: 历程 1 实行。

stderr:
子历程已退出,退出码 0
实行递次2
---------------------
3
stdout: 历程 2 实行。

stderr:
PS C:\Users\mingm\Desktop\test>

node.js的实行动异步实行,致使先轮回3次,每次提交。
所以输出i的值全为3
因为先运转子历程,子历程实行终了今后,触发exit事宜,
实行

        console.log('子历程已退出,退出码 '+code);
        console.log('实行递次' + count++);

该两句。
接着实行

        console.log('---------------------');
        console.log(i);
        console.log('stdout: ' + std);
        console.log('stderr: ' + stderr);

实行终了。
node最大的特点是异步实行。

spawn()要领

一样也是运用指定的敕令行,建立新历程。

PS C:\Users\mingm\Desktop\test> node master.js
stdout历程 0 实行。

stdout历程 1 实行。

子历程退出0
stdout历程 2 实行。

子历程退出0
子历程退出0
PS C:\Users\mingm\Desktop\test> node master.js
stdout历程 0 实行。

子历程退出0
stdout历程 1 实行。

stdout历程 2 实行。

子历程退出0
子历程退出0
PS C:\Users\mingm\Desktop\test> node master.js
stdout历程 0 实行。

stdout历程 1 实行。

子历程退出0
stdout历程 2 实行。

子历程退出0
子历程退出0
PS C:\Users\mingm\Desktop\test>

node实行异步相称魔幻
飘忽不定

/*master.js*/
const fs = require('fs');
const child_process = require('child_process');

for(var i=0; i<3; i++) {
    var workerProcess = child_process.spawn('node', ['support.js', i]);

    // 绑定两个事宜
    workerProcess.stdout.on('data', (data) => {
        console.log('stdout' + data);
    });

    workerProcess.stderr.on('data', (data) => {
        console.log('stderr', + data);
    });

    // 设置退出事宜
    workerProcess.on('close', (code) => {
        console.log('子历程退出' + code);
    });
};
/*support.js*/
console.log("历程 " + process.argv[2] + " 实行。" );

和exec()的区分在于exec()是直接回调函数,而spawn()是直接绑定事宜

fork()要领

PS C:\Users\mingm\Desktop\test> node master.js
历程 0 实行。
历程 1 实行。
历程 2 实行。
子历程已退出0
子历程已退出0
子历程已退出0
PS C:\Users\mingm\Desktop\test>
const fs = require('fs');
const child_process = require('child_process');

for(var i=0; i<3; i++) {
    var worker_process = child_process.fork('support.js', [i]);

    worker_process.on('close', (code) => {
        console.log('子历程已退出' + code);
    });
}

照样喜好fork要领。fork很轻易。没有那么多的异步让人头疼。

    原文作者:小小____
    原文地址: https://segmentfault.com/a/1190000015822012
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞