博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Node.js多进程
阅读量:5791 次
发布时间:2019-06-18

本文共 2999 字,大约阅读时间需要 9 分钟。

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---------------------3stdout: 进程 0 执行。stderr:子进程已退出,退出码 0执行顺序1---------------------3stdout: 进程 1 执行。stderr:子进程已退出,退出码 0执行顺序2---------------------3stdout: 进程 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.jsstdout进程 0 执行。stdout进程 1 执行。子进程退出0stdout进程 2 执行。子进程退出0子进程退出0PS C:\Users\mingm\Desktop\test> node master.jsstdout进程 0 执行。子进程退出0stdout进程 1 执行。stdout进程 2 执行。子进程退出0子进程退出0PS C:\Users\mingm\Desktop\test> node master.jsstdout进程 0 执行。stdout进程 1 执行。子进程退出0stdout进程 2 执行。子进程退出0子进程退出0PS 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子进程已经退出0PS 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很方便。没有那么多的异步让人头疼。

转载地址:http://uqwfx.baihongyu.com/

你可能感兴趣的文章
线程退出时执行函数,处理资源
查看>>
java中关于时间的格式化
查看>>
Wine QQ2012 笔记
查看>>
qml demo分析(clocks-时钟)
查看>>
vue去掉#——History模式
查看>>
2018年7月第一周网站建站笔记
查看>>
MongoDB工具MagicMongoDBTool使用介绍(一) -- 简单MongoDB入门
查看>>
javascript的事件
查看>>
201521123009 《Java程序设计》第1周学习总结
查看>>
年终述职--常见问题分析解答
查看>>
在mui中创建aJax来请求数据..并展示在页面上
查看>>
spring 之AOP
查看>>
总结 15/4/23
查看>>
Windows 7环境下网站性能测试小工具 Apache Bench 和 Webbench使用和下载
查看>>
C#常见错误解决方法
查看>>
安装cnpm (npm淘宝镜像)
查看>>
Java 面向对象(基础) 知识点总结I
查看>>
读书笔记《自控力》
查看>>
ceph集群搭建Jewel版本
查看>>
HttpClient 解释
查看>>