任务
1、进程与线程的了解
2、process
3、child_process
4、守护子进程
1、进程与线程的了解
进程
进程 是计算机中的程序关于某数据集合上的一次运行的活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础
每个进程都拥有直接独立空间地址、数据栈
一个进程无法访问另一个进程里面定义的变量、数据结构
但是可以通过建立IPC通信,进程之间可以实现数据共享
进程是线程的容器
一个进程可以有好几个线程
nodeJS中启动一个服务进程,就一个进程
多进程:需要通过child_process中的的方法来创建:例如spawn、 fork
线程
线程是操作系统里面进行运算调度的最小单位
同一个进程中的多条线程可以共享进程中的全部系统资源,如虚拟地址空间、文件描述符等
但同一个进程中的多个线程又有各自的调用栈,自己的寄存环境,自己的线程本地存储
单线程:JS
一个进程一个线程(专一)
尽量别去做大量的同步计算与CPU 耗时的操作
多线程:Java
一个进程多个线程(风流)
2、process模块
是一个全局变量,它提供有关当前 Node.js 进程的信息并对其进行控制,作为一个全局变量,它始终可供 Node.js 应用程序使用,无需使用 require()
console.log(process.env); // 环境变量
console.log(process.pid); // 当前进程的ID
console.log(process.ppid); // 当前进程对应的父进程
console.log(process.cwd()); // 获取当前进程工作目录
2.1 process.exit([code])
调用 process.exit() 将强制进程尽快退出,即使还有尚未完全完成的异步操作
code:默认 0 退出码
0 成功代码
1失败代码 未捕获异常
...
2.2 process.on('exit', cb); 进程退出监听
2.3 process.on('uncaughtException', cb); 捕获异常信息
2.3 process.nextTick(callback); 下一次异步执行之前执行
2.4 process.kill(pid); // 杀死进程, 即使这个函数的名称是process.kill(),它其实只是发送信号, 这点与kill系统调用类似,
2.5 process.send(message); 用于进程之间的通信、message的类型可以是对象也可以是字符串
接收到的消息被视为父进程的ChildProcess对象上的一个'message'事件
2.6 process.on('message', callback(msg)); 监听message
3、child_process模块
创建子进程的四种方法
const {spawn, exec, execFile, fork} = require('child_process');
// spawn
let child = spawn('node', ['./child.js']);
child.stdout.pipe(process.stdout); // 123
// execFile
let child = execFile('node', ['./child.js'], (err, stdout, stderr) => {
console.log(err, stdout, stderr); // null, 123 , ''
});
// exec
exec('node ./child.js', (err, stdout, stderr) => {
console.log(err, stdout, stderr);// null, 123 , ''
});
// fork
let child = fork('./fork-child.js');
child.on('message', (msg) => {
console.log(msg); // 发送信号
});
child.js模块
const fs = require('fs');
fs.readFile('./log.txt', function (err, buf) {
console.log(buf.toString());
});
// log.txt => 123
fork-child.js
process.send('发送信号');
4、守护进程
主进程
const { spawn } = require('child_process');
function startServer(mod) {
let child = spawn('node', [mod]);
child.on('exit', (code) => {
console.log('我在重启');
startServer(mod)
});
}
startServer('./child-server');
子进程
child-server.js
const http = require('http');
http.createServer((req, res) => {
if (req.url === '/exit') {
// 正常访问该接口之后则会将服务关闭
// 如果启用另一个进程一直重启它则不会关闭
process.exit(1);
}
res.end('ok');
}).listen(3002);
网友评论