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

Node.js多进程

时间:2023-04-03 15:36:59 Node.js

Node.js多进程Node.js单线程模式运行,使用事件处理并发。exec()使用子进程的执行命令,缓存子进程的输出。并以回调函数参数的形式返回子进程的输出process.argv()参数为0时为节点文件的绝对地址;当参数为1时,为文件的绝对地址;当参数为2时,为命令第一个参数。child_process.exec回调函数有三个选项,error,stdout,stderrerror是程序执行错误,正常执行会返回nullstdout是程序正常输出stderr是程序错误输出/*master.js*/constfs=require('fs');constchild_process=require('child_process');for(vari=0;i<3;i++){varcount=0;varworkerProcess=child_process.exec('nodesupport.js'+i,function(err,std,stderr){if(err){console.log(err.stack);console.log('错误代码:'+err.code);console.log('Signalreceived:'+err.signal);}console.log('--------------------');console.log(i);console.log('stdout:'+std);console.log('stderr:'+stderr);});workerProcess.on('exit',function(code){console.log('子进程已经退出,退出code'+code);console.log('执行顺序'+count++);});}/*support.js*//*support.js*/console.log("进程"+process.argv[2]+"执行。");执行结果PSC:\Users\mingm\Desktop\test>nodemaster.js子进程已经退出,退出码0执行顺序0---------------------3stdout:process0execution.stderr:childprocesshasexited,exitcode0executionsequence1----------------------3stdout:process1execution.stderr:子进程已经退出,exitcode0Executionsequence2------------------3stdout:Process2execution.stderr:PSC:\Users\mingm\Desktop\test>node.js的执行是异步执行的,导致循环3次,每次提交,所以输出i的值全为3,因为先运行子进程,子进程之后执行后,会触发exit事件,执行console.log。('子进程已退出,退出code'+code);console.log('Executionorder'+count++);这两句。然后执行console.log。日志('------------------');console.log(i);console.log('stdout:'+std);console.log('stderr:'+stderr);执行完成。node最大的特点就是异步执行。spawn()方法还使用指定的命令行来创建新进程。PSC:\Users\mingm\Desktop\test>nodemaster.jsstdout进程0执行。stdout进程1执行。子进程退出0stdout进程2执行。子进程出口0子进程出口0PSC:\Users\mingm\Desktop\test>nodemaster.jsstdoutProcess0执行。子进程退出0标准输出进程1执行。标准输出进程2执行。SubprocessExit0SubprocessExit0PSC:\Users\mingm\Desktop\test>nodemaster.jsstdoutprocess0被执行。stdout进程1被执行。子进程退出0stdout进程2被执行。子进程退出0子进程退出0PSC:\Users\mingm\Desktop\test>node异步执行非常神奇不稳定/*master.js*/constfs=require('fs');constchild_process=require('child_process');for(vari=0;i<3;i++){varworkerProcess=child_process.spawn('node',['support.js',i]);//绑定两个事件workerProcess.stdout。on('data',(data)=>{console.log('stdout'+data);});workerProcess.stderr.on('data',(data)=>{console.log('stderr',+data);});//设置退出事件workerProcess.on('close',(code)=>{console.log('subprocessexit'+code);});};/*support.js*/console.log("Process"+process.argv[2]+"执行。");exec()和exec()的区别是exec()是直接回调函数,而spawn()是直接绑定事件fork()方法PSC:\Users\mingm\Desktop\test>nodemaster.js进程0执行。进程1执行。进程2执行。子进程已退出0子进程已退出0子进程已退出0PSC:\Users\mingm\Desktop\test>constfs=require('fs');constchild_process=require('child_process');for(vari=0;i<3;i++){varworker_process=child_process.fork('support.js',[i]);worker_process.on('close',(code)=>{console.log('子进程已经退出'+code);});}还是比较喜欢fork方式。fork很方便。与其说异步令人头疼。