Node.js--子进程

作者: 宛丘之上兮 | 来源:发表于2018-08-13 20:45 被阅读1次

简介

node.js是基于单线程模型架构,这样可以带来高效的CPU利用率,但是无法却利用多核心的CPU,为了解决这个问题,node.js提供了child_process模块,通过多进程来实现对多核CPU的利用。

child_process这个模块非常重要,掌握了它,等于在node的世界开启了一扇新的大门。熟悉shell脚本的同学,可以用它来完成很多有意思的事情,比如文件压缩、增量部署等。

child_process模块提供了四个创建子进程的函数,分别是spawn,exec,execFile和fork。.exec()、.execFile()、.fork()底层都是通过.spawn()实现的,而且都有对应的同步版本。.exec()、execFile()额外提供了回调,当子进程停止的时候执行。

  • 创建异步进程。 在 Windows 上衍生 .bat 和 .cmd 文件
    1. child_process.exec(command[, options][, callback])
    2. child_process.execFile(file[, args][, options][, callback])
    3. child_process.fork(modulePath[, args][, options])
    4. child_process.spawn(command[, args][, options])
      • options.detached
      • options.stdio
  • 创建同步进程
    1. child_process.execFileSync(file[, args][, options])
    2. child_process.execSync(command[, options])
    3. child_process.spawnSync(command[, args][, options])

exec

创建一个shell,然后在shell里执行命令。执行完成后,将error、stdout、stderr作为参数传入回调方法。

var exec = require('child_process').exec;//return a Function
console.log(exec)// [Function]
// 成功的例子
var execProcess = exec('mkdir delete & cd ./delete & touch 1.txt & ls -alh', function (error, stdout, stderr) {
    if (error) {
        console.error('error: ' + error);
        return;
    }
    console.log('stdout: ' + stdout);
    console.log('stderr: ' + stderr.length);
});
console.log('--------------', execProcess.constructor.name)// ChildProcess
// execProcess.stdout.on('data', (data) => {
//   console.log(`on stdout: ${data}`);
// });回调中已经打印了

// execProcess.stderr.on('data', (data) => {
//   console.log(`on stderr: ${data}`);
// });回调中已经打印了
execProcess.on('close', code => {
    console.log(`child process exited with code ${code}`);
})

console.log('*****************************************************')

// 失败的例子
exec('ls hwgaeefewlweglo.txt', function (error, stdout, stderr) {
    if (error) {
        console.error('error: ' + error);
        return;
    }
    console.log('stdout: ' + stdout);
    console.log('stderr: ' + stderr);
});

execFile

跟.exec()类似,不同点在于,没有创建一个新的shell。file: 可执行文件的名字,或者路径。至少有两个特点:

  1. 比child_process.exec()效率高一些。(实际待测试)
  2. 一些操作,比如I/O重定向,文件glob等不支持。
var execFile = require('child_process').execFile;
execFile('node', ['--version'], function (error, stdout, stderr) {
    if (error) {
        throw error;
    }
    console.log('stdout: ', stdout);
    console.log('stderr: ', stderr);
});

execFile('ls', ['-alh'], function (error, stdout, stderr) {
    if (error) {
        throw error;
    }
    console.log(stdout);
});

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

var spawn = require('child_process').spawn;
var ls = spawn('ls', ['-al']);

ls.stdout.on('data', function(data){
    console.log('data from child: ' + data);
});

ls.stderr.on('data', function(data){
    console.log('error from child: ' + data);
});

ls.on('close', function(code){
    console.log('child exists with code: ' + code);
});

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

  • modulePath <string> 要在子进程中运行的模块。

  • args <Array> 字符串参数列表。

  • options <Object>

    • cwd <string> 子进程的当前工作目录。
    • env <Object> 环境变量键值对。
    • execPath <string> 用来创建子进程的执行路径。
    • execArgv <Array> 要传给执行路径的字符串参数列表。默认为 process.execArgv
    • silent <boolean> 如果为 true,则子进程中的 stdin、 stdout 和 stderr 会被导流到父进程中,否则它们会继承自父进程,详见 child_process.spawn()stdio 中的 'pipe''inherit' 选项。 默认: false
    • stdio <Array> | <string> 详见 child_process.spawn()stdio。 当提供了该选项,则它会覆盖 silent。 如果使用了数组变量,则该数组必须包含一个值为 'ipc' 的子项,否则会抛出错误。 例如 [0, 1, 2, 'ipc']
    • windowsVerbatimArguments <boolean> 决定在Windows系统下是否使用转义参数。 在Linux平台下会自动忽略。默认值: false
    • uid <number> 设置该进程的用户标识。(详见 setuid(2)
    • gid <number> 设置该进程的组标识。(详见 setgid(2)
  • 返回: <ChildProcess>


参考文献
  1. Nodejs入门
  2. 官方API
  3. Nodejs进阶:如何玩转子进程(child_process)

相关文章

  • Node.js--子进程

    简介 node.js是基于单线程模型架构,这样可以带来高效的CPU利用率,但是无法却利用多核心的CPU,为了解决这...

  • Linux回收子进程

    孤儿进程 孤儿进程: 父进程先于子进程结束,则子进程成为孤儿进程,子进程的父进程成为init进程,称为init进程...

  • 孤儿进程、僵尸进程与进程回收

    孤儿进程与僵尸进程 孤儿进程:父亲死了,子进程被init进程领养僵尸进程:子进程死了,父进程没有回收子进程的资源(...

  • PHP的多进程--防止僵尸进程

    何为僵尸进程 僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一...

  • 进程操作

    一、进程创建 进程树 父进程创建若干子进程,子进程再创建其子进程,依次类推,构成进程树。进程的调度,其实就是在进程...

  • 进程

    创建子进程 循环创建N个子进程 回收子进程 守护进程

  • 进程管理

    进程(process)通常可被归为父进程和子进程。 父进程负责创建和结束子进程。子进程调用exit()并不能立即结...

  • 进程相关(二)--子进程

    子进程 子进程是由父进程创建,用于执行某些任务(父进程可以在子进程执行完任务后继续,也可以在子进程执行任务中继续工...

  • 僵尸进程处理方案

    僵尸进程介绍 Z(zombie)-僵尸进程(子进程终止,父进程没有wait子进程) 僵尸进程产生原因 僵尸进程是当...

  • python学习笔记-多任务

    进程 主进程会等待子进程执行完成以后程序在退出 解决办法:主进程退出子进程销毁1、让子进程设置成为守护主进程,主进...

网友评论

    本文标题:Node.js--子进程

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