详解nodejs中的process进程


Posted in NodeJs onMarch 19, 2017

虽然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();

以上所述是小编给大家介绍的nodejs中的process进程,希望对大家有所帮助!

NodeJs 相关文章推荐
nodejs npm install全局安装和本地安装的区别
Jun 05 NodeJs
NodeJS的Promise的用法解析
May 05 NodeJs
nodejs前端自动化构建环境的搭建
Jul 26 NodeJs
用nodejs实现json和jsonp服务的方法
Aug 25 NodeJs
nodejs acl的用户权限管理详解
Mar 14 NodeJs
对mac下nodejs 更新到最新版本的最新方法(推荐)
May 17 NodeJs
通过nodejs 服务器读取HTML文件渲染到页面的方法
May 17 NodeJs
Nodejs中的require函数的具体使用方法
Apr 02 NodeJs
nodejs提示:cross-device link not permitted, rename错误的解决方法
Jun 10 NodeJs
nodejs和react实现即时通讯简易聊天室功能
Aug 21 NodeJs
nodejs nedb 封装库与使用方法示例
Feb 06 NodeJs
浅谈JS和Nodejs中的事件驱动
May 05 NodeJs
nodejs中使用HTTP分块响应和定时器示例代码
Mar 19 #NodeJs
nodejs中向HTTP响应传送进程的输出
Mar 19 #NodeJs
实例分析nodejs模块xml2js解析xml过程中遇到的坑
Mar 18 #NodeJs
nodejs中模块定义实例详解
Mar 18 #NodeJs
Nodejs基于LRU算法实现的缓存处理操作示例
Mar 17 #NodeJs
用nodeJS搭建本地文件服务器的几种方法小结
Mar 16 #NodeJs
nodejs+express实现文件上传下载管理网站
Mar 15 #NodeJs
You might like
PHP批量删除、清除UTF-8文件BOM头的代码实例
2014/04/14 PHP
PHP获取服务器端信息的方法
2014/11/28 PHP
PHP如何通过AJAX方式实现登录功能
2015/11/23 PHP
详解PHP对数组的定义以及数组的创建方法
2015/11/27 PHP
Laravel关联模型中过滤结果为空的结果集(has和with区别)
2018/10/18 PHP
jquery的ajax从纯真网(cz88.net)获取IP地址对应地区名
2009/12/02 Javascript
Json2Template.js 基于jquery的插件 绑定JavaScript对象到Html模板中
2011/10/29 Javascript
jquery操作cookie插件分享
2014/01/14 Javascript
javascript数字时钟示例分享
2014/04/23 Javascript
Javascript中拼接大量字符串的方法
2015/02/05 Javascript
JavaScript获取当前网页最后修改时间的方法
2015/04/03 Javascript
JavaScript设置表单上传时文件个数的方法
2015/08/11 Javascript
浅析JavaScript作用域链、执行上下文与闭包
2016/02/01 Javascript
Bootstrap select实现下拉框多选效果
2016/12/23 Javascript
jQuery实现文章图片弹出放大效果
2017/04/06 jQuery
bootstrap的常用组件和栅格式布局详解
2017/05/02 Javascript
javaScript实现复选框全选反选事件详解
2020/11/20 Javascript
Angular实现的日程表功能【可添加及隐藏显示内容】
2017/12/27 Javascript
p5.js入门教程之鼠标交互的示例
2018/03/16 Javascript
vue+web端仿微信网页版聊天室功能
2019/04/30 Javascript
nuxt踩坑之Vuex状态树的模块方式使用详解
2019/09/06 Javascript
JavaScript实现像雪花一样的Hexaflake分形
2020/07/07 Javascript
[06:04]DOTA2英雄梦之声Vol19卓尔游侠
2014/06/20 DOTA
[03:59]5分钟带你了解什么是DOTA2(第二期)
2017/02/07 DOTA
在Python中使用cookielib和urllib2配合PyQuery抓取网页信息
2015/04/25 Python
六个窍门助你提高Python运行效率
2015/06/09 Python
python+pandas+时间、日期以及时间序列处理方法
2018/07/10 Python
Django Rest framework之权限的实现示例
2018/12/17 Python
win10系统Anaconda和Pycharm的Tensorflow2.0之CPU和GPU版本安装教程
2019/12/03 Python
Python requests模块安装及使用教程图解
2020/06/30 Python
收藏!10个免费高清视频素材网站!【设计、视频剪辑必备】
2021/03/18 杂记
Intimissimi德国网上商店:意大利知名内衣品牌
2018/04/03 全球购物
教师作风整顿个人剖析材料
2014/10/10 职场文书
2014年最新版离婚协议书范本
2014/11/25 职场文书
董事长新年致辞
2015/07/29 职场文书
在项目中使用redis做缓存的一些思路
2021/09/14 Redis