博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】NodeJS之process进程
阅读量:5945 次
发布时间:2019-06-19

本文共 4224 字,大约阅读时间需要 14 分钟。

hot3.png

原文:

进程模块

  process模块允许你获得或者修改当前node进程的设置,不想其他的模块,process是一个全局进程(node主进程),你可以直接通过process变量直接访问它。

  process实现了EventEmitter接口,exit方法会在当进程退出的时候执行。因为进程退出之后将不再执行事件循环,所有只有那些没有回调函数的代码才会被执行。在下面例子中,setTimeout里面的语句是没有办法执行到的。

process.on('exit', function () {  setTimeout(function () {    console.log('This will not run');  }, 100);  console.log('Bye.');});

  在你接触node之后,你就会发现那些影响了主事件循环的异常会把整个node进程宕掉的。这会是相当严重的问题,所以process提供了另外一个有用的事件uncaughtException来解决这个问题,他会把异常抓取出来供你处理。

process.on('uncaughtException', function (err) {  console.log('Caught exception: ' + err);});setTimeout(function () {  console.log('This will still run.');}, 500);// Intentionally cause an exception, but don't catch it.nonexistentFunc();console.log('This will not run.');

   我们来看上面的例子,我们注册了uncaughtException事件来捕捉系统异常。执行到nonexistentFunc()时,因为该函数没有定义所以会抛出异常。因为javascript是解释性的语言,nonexistentFunc()方法上面的语句不会被影响到,他下面的语句不会被执行。所以他的执行结果如下:

Caught exception: ReferenceError: nonexistentFunc is not definedThis will still run.

  我们再看一个例子。

var http = require('http');var server = http.createServer(function(req,res) {  res.writeHead(200, {});  res.end('response');  badLoggingCall('sent response');  console.log('sent response');});process.on('uncaughtException', function(e) {  console.log(e);});server.listen(8080);

   在这里例子中我们创建了一个web服务器,当处理完请求之后,我们会执行badLoggingCall()方法。因为这个方法不存在,所以会有异常抛出。但是我们注册的uncaughtException事件会对异常做出处理,这样服务器不会受到影响得以继续运行。我们会在服务器端记录错误日志。

[ReferenceError: badLoggingCall is not defined]

 

与当前进程交互

node提供了一些process的属性,如下:

process.version:包含当前node实例的版本号;

process.installPrefix:包含安装路径;

process.platform:列举node运行的操作系统的环境,只会显示内核相关的信息,如:linux2, darwin,而不是“Redhat ES3” ,“Windows 7”,“OSX 10.7”等;

process.uptime():包含当前进程运行的时长(秒);

process.getgid(), process.setgid():获取或者设置group id;

process.getuid(), process.setuid():获取或者设计user id;

process.pid:获取进程id;

process.title:设置进程名称;

process.execPath:当前node进程的执行路径,如:/usr/local/bin/node;

process.cwd():当前工作目录;

process.memoryUsage():node进程内存的使用情况,rss代表ram的使用情况,vsize代表总内存的使用大小,包括ram和swap;

process.heapTotal,process.heapUsed:分别代表v8引擎内存分配和正在使用的大小。

 

事件循环和ticker

  node中提供了process.nextTick()方法,允许你访问事件循环和延时那你的工作。他有点类似于setTimeout(),他会在下次tick的时候执行,而且每隔一段事件就会执行一次。我们这里有个例子:

var http = require('http');var s = http.createServer(function(req, res) {  res.writeHead(200, {});  res.end('foo');  console.log('http response');  process.nextTick(function(){console.log('tick')});});s.listen(8000);

  当请求来的时候,会记录日志‘http response’和‘tick’,当没有请求的时候,每隔一段事件会执行事件循环,会输出tick。

  此外,nextTick创建的回调函数具有隔离性,他们之间不会相互影响。

process.on('uncaughtException', function(e) {  console.log(e);});process.nextTick(function() {  console.log('tick');});process.nextTick(function() {  iAmAMistake();  console.log('tock');});process.nextTick(function() {  console.log('tick tock');});console.log('End of 1st loop');

  在这个例子中,首先输出‘End of 1st loop’,然后顺序的输出nextTick的回调函数,第一个会正常输出‘tick’,第二个是一个故意设置的异常会输出异常信息,不会输出‘tock’,因为nextTick回调函数的隔离性,第三个任然会输出‘tick tock’。结果如下:

End of 1st looptick[ReferenceError: iAmAMistake is not defined]tick tock

子进程

  node提供了child_process模块,允许你为主进程创建子进程,这样你就可以使用更多的服务器资源,使用更多的cpu,这些概念在前面的章节有介绍。node提供了child_process. spawn()和child_process. exec()为你实现这一功能,下面我们就单独介绍。

child_process.exec( )

  我们来看exec的一个简单例子,他创建了一个子进程,第一个参数是一个shell命令,第二个参数是回调函数,处理返回结果。

var cp = require('child_process');cp.exec('ls -l', function(e, stdout, stderr) {  if(!e) {    console.log(stdout);    console.log(stderr);  }});

exec()还可以传options的参数:

 

var options = {     encoding: 'utf8',    timeout: 0,    maxBuffer: 200 * 1024,    killSignal: 'SIGTERM',    setsid: false,    cwd: null,    env: null };
var cp = 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:决定在进程中是否创建一个新的会话;

cwd:进程的初始工作目录,为null时表示使用node的当前工作目录;

env:进程的环境变量。

child_process.spawn( )

  child_process.spawn( )比child_process.exec( )更加强大和灵活,例子如下:

var cp = require('child_process');var cat = 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();

转载于:https://my.oschina.net/iNiL0119/blog/750469

你可能感兴趣的文章
应用系统中常见报表类型解析
查看>>
[Silverlight入门系列]使用MVVM模式(9): 想在ViewModel中控制Storyboard动画?
查看>>
3 项目计划
查看>>
SQL Server 2008 下载地址(微软官方网站)
查看>>
如何对已经发布过的InfoPath模板进行修改
查看>>
推荐系统高峰论坛
查看>>
移动互联
查看>>
basic4android 开发教程翻译(三)IDE 小贴士
查看>>
obj-c 定义一个类
查看>>
电脑APK
查看>>
HDU-4335 What is N? 欧拉函数,欧拉定理
查看>>
HDU 1044 Collect More Jewels(搜索,先bfs再dfs)
查看>>
使用RabbitMQ过程中遇到的一个问题(队列为空,但内存暴涨)以及与开发者的邮件沟通...
查看>>
C++/C学习笔记(九)
查看>>
ASP.net MVC 中Security.FormsAuthentication验证用户的状态(匿名|已登录)
查看>>
《C++ Primer》 Part III(Classes and Data Abstraction)
查看>>
FriendlyUrls——在ASP.NET Web表单中使用更友好的URL
查看>>
【javascript】字符串对象常用 api
查看>>
对PostgreSQL中 index only scan 的初步理解
查看>>
poj 2337 Catenyms
查看>>