Node.js几种创建子进程方法

更新日期: 2020-10-27阅读: 1.6k标签: 进程

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'] });

来自:https://github.com/CommanderXL/biu-blog/issues/25


链接: https://www.fly63.com/article/detial/9770

Node.js的进程与子进程:从文档到实践

process 模块是 nodejs 提供给开发者用来和当前进程交互的工具,它的提供了很多实用的 API。从文档出发,管中窥豹,进一步认识和学习 process 模块:

nodejs如何启动多进程?

Node.js 以单线程的模式运行,使用事件驱动来处理异步 IO 并发(底层是多线程的线程池)。然而,要是 Node 运行在一个多核 CPU 上,如何让 Node 充分利用多核的优势,并行地处理任务?

NodeJS 进程是如何退出的

有几种因素可以导致 NodeJS 进程退出。在这些因素中,有些是可预防的,比如代码抛出了一个异常;有些是不可预防的,比如内存耗尽。process 这个全局变量是一个 Event Emitter 实例,如果进程优雅退出,process 会派发一个 exit 事件

Pandora.js让进程间通信更容易

进程间通信 IPC-Hub,简洁的进程间对象代理,经过努力,我们提出了『简洁的进程间对象代理』,看下面的例子会清楚得多:

进程和线程有什么区别?

从用户的角度来看,进程是正在运行的程序实例,而线程是进程中真正执行任务的基本单位。也就是说一个运行的程序至少包含一个进程,一个进程至少包含一个线程,线程不能独立于进程而存在。

进程与线程,你了解多少?

进程与线程,在面试中经常会被问到,或者实际开发中经常遇到。那什么是进程?什么是线程?你对他们了解有多少?我们经常会说:一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间,一个进程可以有多个线程。

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!