Node.js多进程
时间:2022-06-05
本文章向大家介绍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:UsersmingmDesktoptest> node master.js
子进程已退出,退出码 0
执行顺序0
---------------------
3
stdout: 进程 0 执行。
stderr:
子进程已退出,退出码 0
执行顺序1
---------------------
3
stdout: 进程 1 执行。
stderr:
子进程已退出,退出码 0
执行顺序2
---------------------
3
stdout: 进程 2 执行。
stderr:
PS C:UsersmingmDesktoptest>
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:UsersmingmDesktoptest> node master.js
stdout进程 0 执行。
stdout进程 1 执行。
子进程退出0
stdout进程 2 执行。
子进程退出0
子进程退出0
PS C:UsersmingmDesktoptest> node master.js
stdout进程 0 执行。
子进程退出0
stdout进程 1 执行。
stdout进程 2 执行。
子进程退出0
子进程退出0
PS C:UsersmingmDesktoptest> node master.js
stdout进程 0 执行。
stdout进程 1 执行。
子进程退出0
stdout进程 2 执行。
子进程退出0
子进程退出0
PS C:UsersmingmDesktoptest>
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:UsersmingmDesktoptest> node master.js
进程 0 执行。
进程 1 执行。
进程 2 执行。
子进程已经退出0
子进程已经退出0
子进程已经退出0
PS C:UsersmingmDesktoptest>
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很方便。没有那么多的异步让人头疼。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Centos系统下“无法打开并写入文件”问题的解决
- 如何在Linux下设置录音笔时间
- Linux下ZooKeeper分布式集群安装教程
- CentOS 6.5中利用yum搭建LNMP环境的步骤详解
- Linux下Kafka分布式集群安装教程
- Centos下升级Python及Mongodb驱动安装问题
- centOS6中使用crontab定时运行执行jar程序的脚本
- 基于cobbler 实现自动安装linux系统
- Polysh命令实现多日志查询的方法示例
- linux中启动tomcat后浏览器无法访问的解决方法
- Linux查看系统配置常用命令详解
- LNMP下提示File not found问题的解决方法
- Linux 配置SSH免密登录 “ssh-keygen”的基本用法
- 详解Ubuntu 16.04 pycharm设置桌面快捷启动方式
- Linux 7.4上安装配置Oracle 11.2.0.4图文教程