资讯专栏INFORMATION COLUMN

nodejs之process进程小记

Binguner / 949人阅读

摘要:因为进程退出之后将不再执行事件循环,所有只有那些没有回调函数的代码才会被执行。此外,创建的回调函数具有隔离性,他们之间不会相互影响。我们来看的一个简单例子,他创建了一个子进程,第一个参数是一个命令,第二个参数是回调函数,处理返回结果。

虽然node对操作系统做了很多抽象的工作,但是你还是可以直接和他交互,比如和系统中已经存在的进程进行交互,创建工作子进程。node是一个用于事件循环的线程,但是你可以在这个事件循环之外创建其他的进程(线程)参与工作。

  进程模块

  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 defined
This 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 loop
tick
[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://www.ucloud.cn/yun/107231.html

相关文章

  • Node事件机制小记

    摘要:事件的监听与事件的触发事件一事件机制的实现中大部分的模块,都继承自模块。从另一个角度来看,事件侦听器模式也是一种事件钩子的机制,利用事件钩子导出内部数据或状态给外部调用者。的核心就是事件发射与事件监听器功能的封装。 nodejs事件的监听与事件的触发 nodejs事件(Events)showImg(https://segmentfault.com/img/bV0Sqi?w=692&h=...

    airborne007 评论0 收藏0
  • nodejsexpress小记

    摘要:如果说用一句话来概括那就是它开启了服务器端语言。系列的文章并不会从一开始长篇概论的讲的历史,安装,以及其他很琐碎的事情。只会专门介绍关于或者准确来讲是关于的敏捷开发。性能不对已有的特性进行二次抽象,我们只是在它之上扩展了应用所需的基本功能。 如果说用一句话来概括Node那就是:它开启了JavaScript服务器端语言。 Node系列的文章并不会从一开始长篇概论的讲Node的历史,安装,...

    awokezhou 评论0 收藏0
  • nadejs进程管理小记

    摘要:是一个全局内置对象,可以在代码中的任何位置访问此对象,这个对象代表我们的代码宿主的操作系统进程对象。使用对象可以截获进程的异常退出等事件,也可以获取进程的当前目录环境变量内存占用等信息,还可以执行进程退出工作目录切换等操作。 process是一个全局内置对象,可以在代码中的任何位置访问此对象,这个对象代表我们的node.js代码宿主的操作系统进程对象。使用process对象可以截获进程...

    dendoink 评论0 收藏0
  • 动态网站SEO解决方案经验汇总

    摘要:动态网站解决方案汇总先撸撸几个概念单页面应用,基于框架开发的项目很多都属于单页面应用。搜索引擎优化,指通过对网站进行站内优化修复和站外优化,从而提高网站的网站关键词排名以及公司产品的曝光度。为了防止进程挂掉,可以使用来启动,。 动态网站 SEO解决方案汇总 先撸撸几个概念: SPA:单页面应用,基于vue框架开发的项目很多都属于单页面应用。 SSR :server side rend...

    UsherChen 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<