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

nodejs的进程注释

时间:2023-04-03 13:45:00 Node.js

虽然node为操作系统做了很多抽象的工作,但是你仍然可以直接和它交互,比如和系统中已有的进程交互,创建工作子进程。Node是事件循环的一个线程,但是你可以在这个事件循环之外创建其他进程(线程)来参与工作。  Process模块??  process模块??可以获取或修改当前节点进程的设置,与其他模块不同,process是一个全局进程(节点主进程),可以直接通过process变量访问.  进程实现了EventEmitter接口,进程退出时会执行exit方法。因为在进程退出后事件循环将不再执行,只会执行那些没有回调函数的代码。在下面的例子中,setTimeout中的语句无法执行。process.on('退出',function(){  setTimeout(function(){    console.log('这个不会运行');  },100);  console.log('Bye.');});  接触node后,会发现影响主事件循环的异常会拖垮整个node进程。这将是一个相当严重的问题,所以process提供了另一个有用的事件uncaughtException来解决这个问题,他会捕获异常给你处理。process.on('uncaughtException',function(err){  console.log('Caughtexception:'+err);});setTimeout(function(){  console.log('这个还是会运行.');},500);//故意引发异常,但不捕获它。nonexistentFunc();console.log('Thiswillnotrun.');  我们看上面的例子,我们注册了uncaughtException事件来捕获系统异常。执行nonexistentFunc()时,会因为函数未定义而抛出异常。因为javascript是解释型语言,nonexistentFunc()方法上面的语句不会受到影响,他下面的语句也不会执行。所以他的执行结果如下:Caughtexception:ReferenceError:nonexistentFuncisnotdefinedThiswillstillrun.varhttp=require('http');varserver=http.createServer(function(req,res){  res.writeHead(200,{});  res.end('response');  badLoggingCall('sentresponse');  console.log('sentresponse');});process.on('uncaughtException',function(e){  console.log(e);});server.listen(8080);  本例中我们创建了一个web服务器,当请求被处理时,我们badLoggingCall()方法将被执行。因为这个方法不存在,所以抛出异常。但是我们注册的uncaughtException事件会处理异常,这样服务器就不会受到影响,继续运行。我们将在服务器端记录错误。[ReferenceError:badLoggingCallisnotdefined] 与当前进程交互  node提供了一些流程属性,如下:process.version:包含当前node实例的版本号;process.installPrefix:包含安装路径;process.platform:列出node运行的操作系统环境,只显示内核相关信息,如:linux2、darwin,而不是“RedhatES3”、“Windows7”、“OSX10.7”等;process.uptime():包含当前进程的运行时间(秒);process.getgid()、process.setgid():获取或设置组id;process.getuid()、process.setuid():获取或设计用户id;process.pid:获取进程id;process.title:设置进程名称;process.execPath:当前节点进程执行路径,如:/usr/local/bin/node;process.cwd():当前工作目录;process.memoryUsage():节点进程内存使用情况,rss表示ram使用情况,vsize表示totalmemory使用的大小,包括ram和swap;process.heapTotal、process.heapUsed:分别表示v8引擎的内存分配和使用中的大小。  事件循环和ticker  节点中提供了process.nextTick()方法,可以让你访问事件循环,延迟你的工作。他有点类似于setTimeout(),他会在下一个tick时执行,每隔一个事件就会执行一次。这里我们有一个例子:varhttp=require('http');vars=http.createServer(function(req,res){  res.writeHead(200,{});  res.end('foo');  console.log('http响应');  process.nextTick(function(){console.log('tick')});});s.listen(8000); 当请求到来时,会记录log'httpresponse'和'tick',当没有请求时,事件循环会每隔一个事件执行一次,并输出tick。  另外,nextTick创建的回调函数是隔离的,不会互相影响。process.on('uncaughtException',function(e){  console.log(e);});process.nextTick(function(){  console.log('tick');});过程.nextTick(function(){  iAmAMistake();  console.log('tock');});process.nextTick(function(){  console.log('ticktock');});console.log('Endof1stloop'); 本例先输出'Endof1stloop',然后依次输出nextTick的回调函数,第一个正常输出'tick',第二个是特意设置的异常,会输出异常信息,但不会输出'tock',因为nextTick回调函数的隔离,第三个还是会输出'ticktock'。结果如下:Endof1stlooptick[ReferenceError:iAmAMistakeisnotdefined]ticktockchildprocess  node提供了child_process模块??,可以为主进程创建子进程,这样可以使用更多的serverresources和usemore更多的CPUs,这些概念在前面的章节中都有介绍。Node提供了child_process.spawn()和child_process.exec()来为你实现这个功能,下面我们分别介绍。    child_process.exec()  我们看一个exec的简单例子,它创建了一个子进程,第一个参数是一个shell命令,第二个参数是一个回调函数,用于处理返回结果。varcp=require('child_process');cp.exec('ls-l',function(e,stdout,stderr){  if(!e){    console.log(stdout);    console.log(stderr);  }});exec()还可以传递选项参数:varoptions={encoding:'utf8',timeout:0,maxBuffer:200*1024,killSignal:'SIGTERM',setsid:false,cwd:null,env:null};varcp=require('child_process');cp.exec('ls-l',options,function(e,stdout,stderr){  if(!e){    console.log(stdout);    console.log(stderr);  }});encoding:I/O流的编码格式;timeout:进程超时时间;killSignal:当时间或缓冲区超过限制时终止进程的信号;maxBuffer:stdout或stderr可以增长的最大值;setsid:决定是否在进程中创建新的session;cwd:进程初始工作目录,为null时表示使用node的当前工作目录;env:进程的环境变量。  child_process.spawn()  child_process.spawn()比child_process.exec()更加强大和灵活,例子如下:varcp=require('child_process');varcat=cp.spawn('cat');cat.stdout.on('data',function(d){  console.log(d.toString());});cat.on('exit',function(){  console.log('kthxbai');});cat.stdin.write('meow');cat.stdin.end();