Node.js创建子进程的几种实现方式

 更新时间:2023年10月30日 09:24:45   作者:高先生的猫  
这篇文章主要介绍了Node.js创建子进程的几种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

exec

其中exec可用于在指定的shell当中执行命令。

不同参数间使用空格隔开,可用于复杂的命令。

const { exec } = require('child_process')
exec('cat *.js bad_file | wc -l')

exec方法用于异步创建一个新的子进程,可以接受一个callback。

exec('cat *.js bad_file | wc -l', (err, stdout, stderr) => {
  console.log(stdout)
})

传给回调的stdout和stderr参数会包含子进程的stdout和stderr的输出。

execFile

child_process.execFile(file[, args][, options][, callback])
const { execFile } = require('child_process')
execFile('node', ['--version'], (err, stdout, stderr) => {
  console.log(stdout)
})

不是直接衍生一个shell。

而是指定的可执行的文件直接创建一个新的进程。

fork

child_process.fork(modulePath[, args][, options])

创建一个新的node子进程。调用该方法后返回一个子进程的对象。

通过fork方法创建出来的子进程可以和父进程通过内置的ipc通道进行通讯。

衍生的 Node.js 子进程与两者之间建立的 IPC 通信信道的异常是独立于父进程的。

每个进程都有自己的内存,使用自己的 V8 实例。

由于需要额外的资源分配,因此不推荐衍生大量的 Node.js 进程。

其中在options的配置信息当中:

silent

父子进程间stdin/stdout/stderr之间的通讯。

如果置为true,那么子进程的标准输入输出都会被导流到父进程中:

parent.js
const { fork } = require('child_process')
const fd = fork('./sub.js')
 
fd.stdout.on('data', data => console.log(data))
 
sub.js
console.log('this is sub process')

一般在子进程中如果有stdin的时候,可将stdin直接导入到父进程中,这样可进行tty和shell的交互。

如果置为false,那么子进程的标准输入输出都会继承父进程的。

stdio

关于这个的配置见下文。

spawn

child_process.spawn(command[, args][, options])

上面说到的exec,execFile和fork创建新的子进程都是基于这个方法进行的封装。

调用这个方法返回子进程对象。

父子进程间的通讯

其中通过fork方法和spawn创建新的子进程时,在配置选项中有关于stdio的?字段:

这个字段主要用于父子进程间的管道配置。

默认情况下,子进程的 stdin、 stdout 和 stderr 会重定向到 ChildProcess 对象上相应的 subprocess.stdin、 subprocess.stdout 和 subprocess.stderr 流。

这等同于将 options.stdio 设为 ['pipe', 'pipe', 'pipe']。

  • pipe:等同于 [pipe, pipe, pipe] (默认)
  • ignore:等同于 [ignore, ignore, ignore]
  • inherit:等同于 [process.stdin, process.stdout, process.stderr] 或 [0,1,2]

其中inherit即继承父进程的标准输入输出(和父进程共享)。

const { spawn } = require('child_process');
 
// 子进程使用父进程的 stdios
spawn('prg', [], { stdio: 'inherit' });
 
// 衍生的子进程只共享 stderr
spawn('prg', [], { stdio: ['pipe', 'pipe', process.stderr] });
 
// 打开一个额外的 fd=4,用于与程序交互
spawn('prg', [], { stdio: ['pipe', null, null, null, 'pipe'] });

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Nodejs爬虫进阶教程之异步并发控制

    Nodejs爬虫进阶教程之异步并发控制

    这篇文章主要介绍了Nodejs爬虫进阶教程之异步并发控制的相关资料,需要的朋友可以参考下
    2016-02-02
  • nvm如何切换与管理node版本

    nvm如何切换与管理node版本

    这篇文章主要介绍了nvm如何切换与管理node版本问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • 干净卸载Windows的Node.js环境的方法

    干净卸载Windows的Node.js环境的方法

    这篇文章主要介绍了如何干净卸载Windows的Node.js环境的方法,文中通过图文结合的方式讲解的非常详细,对大家删除Node.js环境有一定的帮助,需要的朋友可以参考下
    2025-01-01
  • 基于Node.js进行CSV、JSON以及Excel的数据处理

    基于Node.js进行CSV、JSON以及Excel的数据处理

    在实际业务开发中,数据往往以多种文件格式存在,例如 CSV、JSON 和 Excel,这些格式广泛应用于数据导入导出、报表生成、系统对接以及批量处理任务中,Node.js 凭借丰富的第三方库和良好的异步能力,非常适合进行各类结构化数据的处理,需要的朋友可以参考下
    2025-12-12
  • 如何利用node转发请求详解

    如何利用node转发请求详解

    这篇文章主要给大家介绍了关于利用node转发请求的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 推荐 21 款优秀的高性能 Node.js 开发框架

    推荐 21 款优秀的高性能 Node.js 开发框架

    Node.js是JavaScript中最为流行的框架之一,易于创建可扩展的Web应用。Node.js包含不同类型框架,包括MVC, full-stack,REST API以及Generators。借助这些框架使Node.js更加易于使用,它还支持众多特性功能,只需几个步骤就可快速搭建强大的Web应用。本文为大家推荐21款
    2014-08-08
  • 解决node终端下运行js文件不支持ES6语法

    解决node终端下运行js文件不支持ES6语法

    这篇文章主要介绍了解决node终端下运行js文件不支持ES6语法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • Node.js模块化原理与应用详细介绍

    Node.js模块化原理与应用详细介绍

    本篇文章我们将进入我们的模块化学习,node的模块化正是node的最大特点,能够帮住我们将繁琐的复杂代码变成一个个的小模块,便于引用
    2022-09-09
  • visual studio配置node.js开发的图文教程

    visual studio配置node.js开发的图文教程

    在进行node开发时,使用visual studio作为开发工具是非常常见的选择,本文主要介绍了visual studio配置node.js开发的图文教程,具有一定的参考价值,感兴趣的可以了解一下
    2024-05-05
  • nodejs 中的读取文件fs模块示例详解

    nodejs 中的读取文件fs模块示例详解

    这篇文章主要为大家介绍了nodejs中的读取文件fs模块示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12

最新评论