/**进程练习
* 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
[NODE之12]process对象
最新推荐文章于 2022-08-02 09:33:42 发布