• Node child_process 备忘


    首先是对应的 官方api 

    区别

    其实都是基于 spawn 和 spawnSync

      特点 windows linux&mac

    spawn

    (spawnSync)

    使用流    

    exec

    (execSync)

     衍生 shell 并且在 shell 中运行命令,将命令的输出 stdout 和 stderr放到缓冲区,当完成时则传给回调函数(shell: true)

       

    execFile

    (execFileSync)

    同上,但默认情况下它会直接衍生命令而不先衍生 shell .bat 和 .cmd 文件在没有终端的情况下不能自行执行,所以不好使 比上更高效
    fork 衍生新的 Node.js 进程,并调用指定的模块,该模块已建立了 IPC 通信通道(stdio: 'ipc')    

    创建异步的静默子进程

    // 官方示例,方便做笔记
    
    const fs = require('fs');
    const { spawn } = require('child_process');
    const out = fs.openSync('./out.log', 'a');
    const err = fs.openSync('./out.log', 'a'); // 方便查看子进程输出
    
    const subprocess = spawn('prg', [], {
      detached: true,  // 子进程在父进程退出后继续运行
      stdio: [ 'ignore', out, err ] // 不能是默认值 inherit 或有 ipc
    });
    
    // 父进程的事件循环不会将子进程包含在其引用计数中,使得父进程可以独立于子进程退出
    subprocess.unref();

    通信

    父子进程之间存在 ipc 通信的时候,可以通过 process.on message 和 process.send 来实现通信。如果期望同步效果,可以使用 promise 来包裹整个方法体。

    不存在 ipc 通信的时候,可以通过 nedb 或 log 等来间接通信。nedb 需要注意每次 update 都会再追加一项,在 read 的时候再去压缩成一条,或者可以设置自动压缩任务。

    其他

    1、父进程 env 默认传 process.env 到子进程,但是 spawn 会自动 stringify 这个 env 参数,所以父进程的复杂环境变量在子进程还是得单独引入

    2、可以通过 process.title = xxx 的形式来给子进程特殊命名,方便使用 ps 或 tasklist 来查看子进程的存活情况。此举还可以用来 kill 不期望的子进程。需要注意的事子进程存活并不代表子进程正常运行,可以通过 nedb 写心跳的形式来判断子进程的存活。

    3、想起来了再写

  • 相关阅读:
    day_5.25py
    day_5.24py
    day_5.22 py
    numpy模块 03
    requests 模块例题示范
    logging模块
    typing 模块
    hashlib模块和hmac模块
    random模块
    time和datetime模块
  • 原文地址:https://www.cnblogs.com/codetker/p/13662767.html
Copyright © 2020-2023  润新知