虽然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
# process进程
# Nodejs进程管理模块forever详解
# 利用NodeJS的子进程(child_process)调用系统命令的方法分享
# Nodejs极简入门教程(三):进程
# nodejs 子进程正确的打开方式
# NodeJS感知和控制自身进程的运行环境和状态
# 是一个
# 回调
# 在这个
# 你可以
# 第一个
# 其他的
# 会在
# 第二个
# 会把
# 每隔
# 抛出
# 操作系统
# 这一
# 就会
# 在这里
# 会有
# 有个
# 还可以
# 你就
# 和他
相关文章:
网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?
如何在建站之星网店版论坛获取技术支持?
香港服务器网站推广:SEO优化与外贸独立站搭建策略
如何正确下载安装西数主机建站助手?
教程网站设计制作软件,怎么创建自己的一个网站?
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
北京网站制作网页,网站升级改版需要多久?
如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
免费公司网站制作软件,如何申请免费主页空间做自己的网站?
如何用搬瓦工VPS快速搭建个人网站?
如何高效利用200m空间完成建站?
中山网站推广排名,中山信息港登录入口?
成都响应式网站开发,dw怎么把手机适应页面变成网页?
Android使用GridView实现日历的简单功能
盐城做公司网站,江苏电子版退休证办理流程?
Android自定义控件实现温度旋转按钮效果
如何快速搭建个人网站并优化SEO?
网站制作企业,网站的banner和导航栏是指什么?
网站设计制作公司地址,网站建设比较好的公司都有哪些?
我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?
如何快速生成ASP一键建站模板并优化安全性?
建站之星如何保障用户数据免受黑客入侵?
如何通过FTP空间快速搭建安全高效网站?
建站之星如何助力网站排名飙升?揭秘高效技巧
php条件判断怎么写_ifelse和switchcase的使用区别【对比】
ppt制作免费网站有哪些,ppt模板免费下载网站?
如何在万网自助建站平台快速创建网站?
南平网站制作公司,2025年南平市事业单位报名时间?
javascript基本数据类型及类型检测常用方法小结
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
建站主机选择指南:服务器配置与SEO优化实战技巧
建设网站制作价格,怎样建立自己的公司网站?
网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?
PHP 500报错的快速解决方法
广州商城建站系统开发成本与周期如何控制?
如何在云主机上快速搭建网站?
python的本地网站制作,如何创建本地站点?
网站制作难吗安全吗,做一个网站需要多久时间?
建站VPS推荐:2025年高性能服务器配置指南
在线制作视频的网站有哪些,电脑如何制作视频短片?
建站之星好吗?新手能否轻松上手建站?
太原网站制作公司有哪些,网约车营运证查询官网?
如何快速选择适合个人网站的云服务器配置?
如何在IIS中新建站点并配置端口与物理路径?
建站VPS选购需注意哪些关键参数?
c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
制作网站怎么制作,*游戏网站怎么搭建?
如何在建站主机中优化服务器配置?
*请认真填写需求信息,我们会在24小时内与您取得联系。