当前位置: 首页 > 后端技术 > Node.js

NodeJs简明教程(8)

时间:2023-04-04 01:15:11 Node.js

NodeJs简明教程将从零开始学习NodeJs相关知识,帮助JS开发者搭建全栈开发技术栈!关注获取更多NodeJs精品文章本文为NodeJs简明教程第八篇,将介绍NodeJs子进程模块相关的基本操作。child_process模块提供了生成子进程的能力(以类似于但不完全相同的方式popen(3))。NodeJs的JS线程虽然是单线程,不能使用多核CPU,也不能执行CPU密集型任务,但是通过在派生子进程的形式。spawnspawn可以执行指定的命令,spawn的函数原型如下:child_process.spawn(command[,args][,options])command要执行的命令args传递给command的参数列表optionsextraoptionscwdchildprocessworkdirenvchildprocessenvironmentvariablesconst{spawn}=require('child_process');constls=spawn('ls',['-lh','/usr']);//命令配置ls.stdout.on('data',(data)=>{//监听命令执行的标准输出console.log(`stdout:${data}`);});ls.stderr。on('data',(data)=>{//监听命令执行的标准错误输出console.log(`stderr:${data}`);});ls.on('close',(code)=>{//监控子进程退出console.log(`subprocessexit,useexitcode${code}`);});以上例程输出(不同机器输出可能不同)stdout:total0drwxr-xr-x970rootwheel30K71923:00bindrwxr-xr-x306rootwheel9.6K71222:35libdrwxr-xr-x249root轮7.8K71923:00libexecdrwxr-xr-x15根轮480B4114:15localdrwxr-xr-x239根轮7.5K71222:35sbindrwxr-xr-x46根轮1.4K9212018sharedrwxr-xr-x5根轮160B9212018支架单独子进程退出,使用退出码0execexec也可以执行指定命令,与spawn的区别是通过回调通知执行结果,而spawn是通过事件,exec函数原型如下:exec(command[,options][,callback])command要执行的命令,命令参数用空格隔开optionsextraoptioncwdsubprocessworkdirenvsubprocess环境变量timeoutsubprocess执行超时callback执行结果callbackerror执行错误(不是子进程的错误输出)stdout子进程的标准输出stderr子进程的标准错误输出constexec=require('child_process').exec;exec('ls-lh/usr',function(err,stdout,stderr){if(err){console.log('执行错误',err);}console.log('stdout',标准输出);console.log('stderr',stderr);});以上例程输出标准输出:total0drwxr-xr-x970rootwheel30K71923:00bindrwxr-xr-x306rootwheel9.6K71222:35libdrwxr-xr-x249rootwheel7.8K71923:00libexecdrwxr-xr-x15根轮480B4114:15localdrwxr-xr-x239根轮7.5K71222:35sbindrwxr-xr-x46根轮1.4K9212018sharedr-xr-x5rootwheel160B9212018独立子进程退出,退出码为0execMoreefficient支持与exec相同的选项。由于没有生成的shell,因此不支持I/O重定向和文件通配等行为。execFile原型:execFile(file[,args][,options][,callback])file要执行的命令或可执行文件路径args字符串数组中的参数列表optionsextraOptioncwd子进程workdirenv子进程环境变量timeout子进程执行超时回调执行结果回调错误执行错误(不是子进程的错误输出)stdout子进程标准输出stderr子进程标准错误输出constexecFile=require('child_process').execFile;execFile('ls',['--version'],function(error,stdout,stderr){if(err){console.log('执行错误',err);}console.log('stdout',stdout);console.log('stderr',stderr);});上面的例程输出是同execforkforkspawn的特例,专门用来spawn新的NodeJs进程。spawn可以产生任何进程。fork方法的原型如下:fork(modulePath[,args][,options])modulePath要执行的JS路径args字符串数组形式的参数列表optionsextraoptioncwdsubprocess'sworkdirenv环境变量silent如果为true,子进程的stdin、stdout和stderr将被发送给父进程,否则从父进程继承。默认falseb.jsconstfork=require('child_process').fork;constchild=fork('./a.js',{silent:true});//当silent为true时,可以监听子进程的标准输出和标准错误Outputchild.stdout.on('data',function(data){//监听子进程的标准输出console.log('childstdout',data.toString('utf8'));});child.stderr.on('data',function(data){//监听子进程的标准错误输出console.log('childstderr',data.toString('utf8'));});child.on('close',function(){console.log('childexit');});a.jsconsole.log('我是子进程`);终端执行nodeb.js,以上例程输出:childstdoutIamachildprocesschildexitEpilogue子进程模块介绍到此结束。通常,您可以使用spawn和execFile。有问题欢迎扫码进群交流: