美文网首页
Node.js child_process

Node.js child_process

作者: 西域战神 | 来源:发表于2021-05-23 21:07 被阅读0次

    进程Process

    场景:

    vscode.exe是一个程序,不是一个进程,双击vscode.exe,系统会打开一个进程。

    定义:

    进程是程序的执行实例
    程序在cpu执行的活动叫进程

    特点:

    一个进程可以创建另一个进程。(父进程与子进程)

    CPU

    特点:

    一个单核CPU在一个时刻只能做一件事,但是可以在不同进程中快速切换

    多程序并发执行:

    指多个程序在宏观上并行,微观上并行
    每个进程会出现 【执行-暂停-执行】的规律
    多个进程之间会抢资源

    阻塞

    等待执行的进程中:
    1.都是非运行态
    2.一些(A)在等待CPU资源
    3.一些(B)在等待I/O完成
    4.如果把CPU分配给(B)进程,(B)还是在等I/O
    5.我们把(B)叫做阻塞进程

    分配程序只会把CPU分配给非阻塞进程

    线程Thread

    阶段

    1.在面向进程设计的系统中,进程是程序的基本执行实体
    2.在面向线程设计的系统中,进程本身不是基本运行单位,而是线程的容器

    引入线程的原因:

    进程是执行的基本实体,也是资源分配的基本实体。
    导致进程的创建,切换,销毁太消耗cpu时间
    引入线程,线程作为执行的基本实体,而进程制作为资源分配的基本实体

    概念:

    CPU调度和执行的最小单元
    一个进程至少有一个线程
    一个进程中的线程共享该进程的所有资源
    进程的第一个线程叫做初始化线程
    线程的调度可以由操作系统负责,也可以用户负责

    举例:

    浏览器进程中有渲染引擎,V8引擎,存储模块,网络模块
    每个模块都可以放一个线程中

    child_process

    子进程的运行结果存储在系统缓存中(大约200kb),等子进程运行结束,主进程再回调函数读取子进程的运行结果

    exec(cmd,options,fn) (会被注入,尽量不用,用execFile)

    const child_process = require('child_process')
    const {exec} = child_process
    const stream = exec('ls -l ../')
    stream.stdout.on('data',(chunk)=>{
        console.log(chunk)
    })
    

    options的选项:

    cwd: current working directory
    env:环境变量
    shell,
    maxBuffer-最大缓存,默认1024 * 1024

    spawn:

    用法与execFile类似,只能通过流事件获取结果,没有最大200kb限制

    const child_process = require('child_process')
    const {spawn} = child_process
    const userInput = "."
    const streams = spawn("ls",["-la",userInput],{
        cwd:'./'
    })
    streams.stdout.on('data',(chunk)=>{
        console.log(chunk)
    })
    

    fork:

    创建一个子进程,相当于执行node脚本,fork('./child.js')相当于spawn('node',['./child.js'])

    特点:

    会多出一个message事件,用于父子通信
    会多一个send方法

    parent.js

    const n = child_process.fork('./child.js');
    n.on('message', function(m) {
    console.log('PARENT got message:', m);
    });
    n.send({ hello: 'world' });
    
    

    child.js

    process.on('message', function(m) { 
    console.log('CHILD got message:', m); 
    }); 
    process.send({ foo: 'bar' });
    

    new Worker

    v11.7 之前需要-- experimental-worker开启,效率不高
    工作线程对cpu密集型有用,但I/O操作效率不高

    相关文章

      网友评论

          本文标题:Node.js child_process

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