简介
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 文件
options.detached
options.stdio
child_process.exec(command[, options][, callback])
child_process.execFile(file[, args][, options][, callback])
child_process.fork(modulePath[, args][, options])
child_process.spawn(command[, args][, options])
创建同步进程
child_process.execFileSync(file[, args][, options])
child_process.execSync(command[, options])
child_process.spawnSync(command[, args][, options])
exec
创建一个shell,然后在shell里执行命令。执行完成后,将error、stdout、stderr作为参数传入回调方法。
var exec = require('child_process').exec;//return a Functionconsole.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: 可执行文件的名字,或者路径。至少有两个特点:
比child_process.exec()效率高一些。(实际待测试)
一些操作,比如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
。
返回: <ChildProcess>
作者:宛丘之上兮
链接:https://www.jianshu.com/p/c5ec1e7cd954
共同学习,写下你的评论
评论加载中...
作者其他优质文章