[NODE之12]process对象

/**进程练习
 * Created by liyanq on 17/3/24.
 * 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
 * 在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;
 * 在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
 * 特征
 * 动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的。
 * 并发性:任何进程都可以同其他进程一起并发执行
 * 独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;
 * 异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进
 * 结构特征:进程由程序、数据和进程控制块三部分组成。
 * 多个不同的进程可以包含相同的程序:一个程序在不同的数据集里就构成不同的进程,能得到不同的结果;
 * 但是执行过程中,程序不能发生改变。
 * --来自 百度百科
 */

/**process对象是一个全局对象,它可以在任何地方被访问.它是一个EventEmitter对象的实例.*/
const util = require("util");
const os = require("os");
/*----------------------------------------------------------------------------------*/
/*beforeExit事件
 * 1,listen的函数有参数,这个参数就是exitCode.
 * 2,通过exit和其他异常退出的进程是不触发监听事件的(重要~)~*/
process.once("beforeExit", function (exitCode) {
    console.log("beforeExit事件触发了,exitCode:" + exitCode);//beforeExit事件触发了,exitCode:5
});
process.exitCode = 5;

/*----------------------------------------------------------------------------------*/
/*exit事件
 * 1,如果进入了exit的事件中,没有什么方式能阻止进程的结束.
 * 2,与beforeExit不同的是,process.exit(1)和throw new Error("error")都能触发该事件
 * 3,监听函数必须是同步的,setTimeOut里面的内容永远不会执行到~*/
process.on("exit", function (exitCode) {
    console.log("exit事件触发了,exitCode:" + exitCode);//beforeExit事件触发了,exitCode:5
});

/*----------------------------------------------------------------------------------*/
/*rejectionHandled
 * 1,unhandledRejection:针对promise对象中,如果没有处理的异常或拒绝,那么触发该事件.pRejectionHandled
 * 2,rejectionHandled:unhandledRejection触发后,又处理了异常或拒绝,那么触发该事件.
 * 3,注意链式写法与非链式写法的区别,主要看是否是同一对象及触发时机.
 * */
const unhandledRejections = new Map();
process.on('unhandledRejection', (reason, p) => {
    unhandledRejections.set(p, reason);
    // console.log("unhandledRejection事件触发,原因是:" + reason);
});
process.on('rejectionHandled', (p) => {
    unhandledRejections.delete(p);
    // console.log("rejectionHandled事件触发,promise对象:" + p);
});

var pRejectionHandled = new Promise(function (resolve, reject) {
    throw "我是Promise对象构造函数里面未处理的异常~";
});

// setTimeout(function () {
//     pRejectionHandled.catch(function (e) {
// console.log("我处理了pRejectionHandled异常信息" + e);
// });
// }, 1000);
/*----------------------------------------------------------------------------------*/
/*uncaughtException事件
 *1,捕捉代码里面未捕捉到的异常
 *2,处理函数中有err参数
 * 3, It is not safe to resume normal operation after 'uncaughtException'.
 * 注意:
 * uncaughtException是一个很低级的异常处理,在将来可能被移除.
 * 不要使用它,用domains代替(后面会讲),如果你非用不可,只好每次在程序发生异常之后重启.
 * 不要把它和'On Error Resume Next'一起用,因为一个未处理的异常意味着你的程序--甚至是node.js自己--
 * 在一个未定义的状态.盲目的恢复继续执行疑问这任何事都可能发生.*/
process.on('uncaughtException', function (err) {
    // console.log("uncaughtException事件触发了:" + err);//ReferenceError: nonexistentFunc is not defined
});
setTimeout(function () {
    // console.log("即使有异常了,这里仍将执行...");
}, 200);
// nonexistentFunc();
// console.log("我这里永远执行不到了...");
/*----------------------------------------------------------------------------------*/
/*warning事件,这个看了看,估计用不到,以后再说吧~*/
/*Signal Events
 * */
// process.stdin.resume();
process.on('SIGINT', () => {//能捕捉到<Ctrl>-C信号~
    console.log('Received SIGINT.  Press Control-D to exit.');
});
/*----------------------------------------------------------------------------------*/
/*process.arch:操作系统 CPU 架构
 * 同os.arch()*/
console.log("操作系统 CPU 架构:" + process.arch);//x64
/*----------------------------------------------------------------------------------*/
/*process.argv:返回当前命令行的参数
 * 返回:<Array>
 * 前2个返回值固定,NODE的安装路径和当前执行的js路径~*/
for (const arg of process.argv) {
    /*/usr/local/bin/node
     /Users/liyanq/WebstormProjects/learnWebPack/school/testProcess.js*/
    console.log(arg);
}
/*----------------------------------------------------------------------------------*/
/*process.cwd:返回当前进程的工作目录*/
console.log("当前进程的工作目录:" + process.cwd());
/*----------------------------------------------------------------------------------*/
/*process.chdir(directory):改变进程的工作目录
 * 这个估计也用不到,以后再说吧~*/
/*----------------------------------------------------------------------------------*/
/*process.execPath:当前node进程的执行路径*/
console.log("node进程的执行路径:" + process.execPath);// /usr/local/bin/node
/*----------------------------------------------------------------------------------*/
/*process.env:用户的环境变量的对象*/
console.log("用户的环境变量的对象:" + util.inspect(process.env));
/*----------------------------------------------------------------------------------*/
/*process.versions:暴露存储node以及其依赖包版本信息的属性:*/
console.log("依赖包:" + util.inspect(process.versions));
/*----------------------------------------------------------------------------------*/
/*process.memoryUsage()
 rss代表ram的使用情况,vsize代表总内存的使用大小,包括ram和swap
 heapTotal and heapUsed refer to V8's memory usage.
 external refers to the memory usage of C++ objects bound to JavaScript objects managed by V8.
 * { rss: 19169280,
 * heapTotal: 7376896,
 * heapUsed: 3379344,
 * external: 8748 }
 */
console.log("进程的所占内存:" + util.inspect(process.memoryUsage()));
/*----------------------------------------------------------------------------------*/
/*process.platform*/
console.log("进程的运行平台:" + util.inspect(process.platform));//darwin
/*----------------------------------------------------------------------------------*/
/*process.uptime():包含当前进程运行的时长(秒)*/
console.log("进程的运行时间(s):" + process.uptime());//0.075s
/*----------------------------------------------------------------------------------*/
/*process.hrtime():返回当前的高分辨时间,形式为 [秒,纳秒] 的元组数组。
 它是相对于在过去的任意时间。该值与日期无关,因此不受时钟漂移的影响。
 主要用途是可以通过精确的时间间隔,来衡量程序的性能。*/
var t1 = process.hrtime();
var arr = new Array(40000000),
    s = arr.join(',');
var t2 = process.hrtime();
console.log('处理数组共花费了%d秒,详细为%d纳秒', (t2[0] - t1[0]), (t2[1] - t1[1]));
/*----------------------------------------------------------------------------------*/
/*process.getuid():获得线程的用户id,这是一个数字id,不是一个用户名.这个函数支持posix平台,不支持windows平台
 * process.setuid(id):设置执行进程的用户ID。参数可以使一个数字ID或者用户名字符串。如果指定了一个用户名,那么该方法会阻塞等待将用户名解析为数字ID*/
if (process.getuid && process.setuid) {
    console.log('当前uid: ' + process.getuid());
    try {
        // process.setuid(501);
        console.log('新uid: ' + process.getuid());
    }
    catch (err) {
        console.log('设置uid 失败: ' + err);
    }
}
/*----------------------------------------------------------------------------------*/
/*process.getgid:获取进程的群组标识。获取到的是群组的数字ID,不是群组名称。
 * process.setgid(id):设置进程的群组标识。参数可以是一个数字ID或者群组名字符串。
 *                    如果指定了一个群组名,这个方法会阻塞等待将群组名解析为数字ID。*/
if (process.getgid) {
    console.log('当前 gid: ' + process.getgid());
}
if (process.getgid && process.setgid) {
    console.log('当前 gid: ' + process.getgid());
    try {
        process.setgid(501);
        console.log('新 gid: ' + process.getgid());
    }
    catch (err) {
        console.log('设置 gid 失败: ' + err);//设置 gid 失败: Error: EPERM, Operation not permitted
    }
}
/*----------------------------------------------------------------------------------*/
/*process.nextTick(callback[, ...args])
 * 算是 process 对象最重要的一个属性方法了,表示在事件循环(EventLoop)的下一次循环中调用 callback 回调函数。
 * 要注意的是它总会在I/O操作(比如查询数据)之前先执行。*/

function processNextTick(arg, callback) {
    if (arg) {
        process.nextTick(callback);//下一次循环中调用
    }
}
processNextTick(true, function () {
    console.log("我是第二个执行的函数")
});
console.log("我是第一个执行的函数");
/*process.stdin
* 有data事件的监听后,readable的事件就不触发了~~~*/
process.stdin.setEncoding('utf8');
process.stdin.on('data', (data) => {
    process.stdout.write(`data: ${data}`);
});
process.stdin.on('readable', () => {
    var chunk = process.stdin.read();
    if (chunk !== null) {
        process.stdout.write(`readable data: ${chunk}`);
    }
});
process.stdin.on('end', () => {
    process.stdout.write('end');
});

/*----------------------------------------------------------------------------------*/
/* 文档说是和子进程、集群有关系,以后再说吧~~
 * process.connected:连接事件
 * disconnect事件:断开连接
 *
 * message事件:监听函数有2个参数
 * message: <Object> a parsed JSON object or primitive value
 * sendHandle: <Handle object> a net.Socket or net.Server object, or undefined.
 *
 * process.send(message[, sendHandle[, options]][, callback])
 * message <Object>
 * sendHandle <Handle object>
 * options <Object>
 * callback <Function>
 * Returns: <Boolean>
 * If Node.js is spawned with an IPC channel, the process.send() method can be used to send messages to the parent process.
 * Messages will be received as a 'message' event on the parent's ChildProcess object.
 * If Node.js was not spawned with an IPC channel, process.send() will be undefined.
 * Note: This function uses JSON.stringify() internally to serialize the message.
 * 属于子进程、集群与主进程交流的通道,以后再说吧~*/
http://nodejs.cn/api/process.html#process_process_abort
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值