【悄咪咪学Node.js】7.6 os.getPriority() 和 os.setPriority() 优先级
os.getPriority() 和 os.setPriority() 优先级
1. 前言
本系列课程对非功能性函数内容安排中,将插入一些在生产过程中可能会用到对应函数的例子。
本节课将会引导大家学习了解:
os.getPriority()
、os.setPriority()
的使用方法os.setPriority()
在 windows 上的平台差异
学习完本节课程后,应该具有:
- 使用
os
模块获取和修改进程优先级的能力
2. 进程优先级
每个进程都有相应的优先级,优先级决定它何时运行和接收多少 CPU 时间。
优先级越高,其值越低,值有效区间为 [-20, 19]。
优先级的高低影响的是占用 CPU 的时间长短。优先级越高,在一个周期中占用 CPU 的时间越长,在系统资源吃紧的时候,也会优先分配给优先级高的进程。
3. os.getPriority()
os.getPriority()
可以获取某进程的优先级,接收参数为 pid
。
3.1 代码例子
我们先来生成一个存在时间长的进程:
// 打印进程 pid
console.log(process.pid);
setTimeout(function() {
console.log("end");
}, 10 * 60 * 1000);
这段代码运行后,会产生一个存活 10 分钟的进程,并在运行之初打印出该进程的 pid
结果:
90758
我们再来执行下面这段代码,来打印刚刚生成的进程的优先级:
// 引入 os 模块
const os = require('os');
// 打印结果
console.log(os.getPriority(90758));
结果:
0
Tips:默认情况下,进程的优先级是标准,值为 0 。
4. os.setPriority()
os.setPriority()
可以对某进程设置优先级,如果传入 1 个参数,则对本进程设置优先级。如果传入 2 个参数,如 os.setPriority(pid, priority)
则对第一个参数 pid
的进程,设置优先级 priority
。
4.1 代码例子
4.1.1 降低优先级
我们先执行以下语句:
const os = require('os');
// 对本进程调整优先级到 19 (降低优先级到最低)
os.setPriority(19);
// 打印本进程优先级
console.log(os.getPriority(process.pid));
结果:
19
4.1.2 提高优先级
我们先执行以下语句:
const os = require('os');
// 对本进程调整优先级到 -20 (提高优先级到高)
os.setPriority(-20);
// 打印本进程优先级
console.log(os.getPriority(process.pid));
windows 结果:
-20
macos 结果:
os.js:223
throw new ERR_SYSTEM_ERROR(ctx);
^
SystemError [ERR_SYSTEM_ERROR]: A system error occurred: uv_os_setpriority returned EACCES (permission denied)
at Object.setPriority (os.js:223:11)
at Object.<anonymous> (/Users/lihaolin/programing/spider/spider-man-server/test/priority.js:13:4)
at Module._compile (internal/modules/cjs/loader.js:778:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
at Module.load (internal/modules/cjs/loader.js:653:32)
at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
at Function.Module._load (internal/modules/cjs/loader.js:585:3)
at Function.Module.runMain (internal/modules/cjs/loader.js:831:12)
at startup (internal/bootstrap/node.js:283:19)
at bootstrapNodeJSCore (internal/bootstrap/node.js:622:3)
在 macos 系统中(大部分 linux 也是),使用普通用户权限来执行 Node.js 脚本,来提高优先度到值小于 0 时,会报 没有权限( permission denied ) 的错误。
在遇到这种情况时,需要使用 sudo
来启动 Node.js,如 sudo node setPriority.js
macos 使用 sudo
执行结果:
-20
4.2 平台差异
在 windows 平台上,使用 os.setPriority()
设置进程优先级时,不一定会设置成对应数值
windows 下执行以下语句:
const os = require('os');
os.setPriority(-2);
console.log(os.getPriority(process.pid));
结果:
-7
这是因为在 windows 上,优先级对应 6 种不同的等级:
由于 -2 小于 0,判断为高于正常,而高于正常实际对应的值为 -7,所以代码最终打印值为 -7。
我们也可以使用 windows 平台的优先级别名来定义:
const os = require('os');
os.setPriority(os.constants.priority.PRIORITY_ABOVE_NORMAL);
console.log(os.getPriority(process.pid));
结果:
-7
我们打印下 os.constants.priority
看看:
const os = require("os");
console.log(os.constants.priority);
结果:
[Object: null prototype] {
PRIORITY_LOW: 19,
PRIORITY_BELOW_NORMAL: 10,
PRIORITY_NORMAL: 0,
PRIORITY_ABOVE_NORMAL: -7,
PRIORITY_HIGH: -14,
PRIORITY_HIGHEST: -20 }
这里提供一份官方对应表以供参考:
常量 | 描述 |
---|---|
PRIORITY_LOW | 最低进程调度优先级。这与 Windows 上的 IDLE_PRIORITY_CLASS 相对应,在所有其他平台上的值为 19。 |
PRIORITY_BELOW_NORMAL | 进程调度优先级高于 PRIORITY_LOW 且低于 PRIORITY_NORMAL。这对应于 Windows 上的 PRIORITY_NORMAL,并且在所有其他平台上的值为 10。 |
PRIORITY_NORMAL | 默认的进程调度优先级。这对应于 Windows 上的 NORMAL_PRIORITY_CLASS,并且在所有其他平台上的值为 0。 |
PRIORITY_ABOVE_NORMAL | 进程调度优先级高于 PRIORITY_NORMAL 且低于 PRIORITY_HIGH。这对应于 Windows 上的 ABOVE_NORMAL_PRIORITY_CLASS,并且在所有其他平台上的值为 -7。 |
PRIORITY_HIGH | 进程调度优先级高于 PRIORITY_ABOVE_NORMAL 且低于 PRIORITY_ABOVE_NORMAL。这对应于 Windows 上的 HIGH_PRIORITY_CLASS,并且在所有其他平台上的值为 -14。 |
PRIORITY_HIGHEST | 最高进程调度优先级。 这对应于 Windows 上的 REALTIME_PRIORITY_CLASS,在所有其他平台上的值为 -20。 |
5. 生产中的作用
-
用法一:
对本系统进程优先级作修改,以在系统资源分配上获取优势
const os = require('os'); os.setPriority(os.constants.priority.PRIORITY_HIGH);
-
用法二:
对本系统生成的子进程作优先级调节
const os = require('os'); // 假设本方法能生成子进程并将子进程 pid 返回 const generateChildProcess = function() { // todo... // 子进程相关实现方法,请跳转 child_process 章节 return child.pid; } os.setPriority(generateChildProcess(), os.constants.priority.PRIORITY_ABOVE_NORMAL);
6. 小结
本节课程我们主要学习了 os.getPriority()、os.setPriority() 及其在生产上的用法。
重点如下:
-
重点1
优先级越高,其对应的值越小,值的范围是 [-20, 19]
-
重点2
windows 平台上,优先级分 6 个档次
转载自:https://juejin.cn/post/7351326289763729446