美文网首页
十天上手Node+KOA(2)

十天上手Node+KOA(2)

作者: 贝程学院_前端 | 来源:发表于2019-08-12 08:53 被阅读0次

    任务

    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);
    

    相关文章

      网友评论

          本文标题:十天上手Node+KOA(2)

          本文链接:https://www.haomeiwen.com/subject/crcyjctx.html