十天上手Node+KOA(2)

任务

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);
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容