【悄咪咪学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 代码例子

我们先来生成一个存在时间长的进程:

js 复制代码
// 打印进程 pid
console.log(process.pid);

setTimeout(function() {
    console.log("end");
}, 10 * 60 * 1000);

这段代码运行后,会产生一个存活 10 分钟的进程,并在运行之初打印出该进程的 pid

结果:

shell 复制代码
90758

我们再来执行下面这段代码,来打印刚刚生成的进程的优先级:

js 复制代码
// 引入 os 模块
const os = require('os');

// 打印结果
console.log(os.getPriority(90758));

结果:

shell 复制代码
0

Tips:默认情况下,进程的优先级是标准 ,值为 0

4. os.setPriority()

os.setPriority() 可以对某进程设置优先级,如果传入 1 个参数,则对本进程设置优先级。如果传入 2 个参数,如 os.setPriority(pid, priority) 则对第一个参数 pid 的进程,设置优先级 priority

4.1 代码例子

4.1.1 降低优先级

我们先执行以下语句:

js 复制代码
const os = require('os');

// 对本进程调整优先级到 19 (降低优先级到最低)
os.setPriority(19);

// 打印本进程优先级
console.log(os.getPriority(process.pid));

结果:

shell 复制代码
19

4.1.2 提高优先级

我们先执行以下语句:

js 复制代码
const os = require('os');

// 对本进程调整优先级到 -20 (提高优先级到高)
os.setPriority(-20);

// 打印本进程优先级
console.log(os.getPriority(process.pid));

windows 结果:

shell 复制代码
-20

macos 结果:

shell 复制代码
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 执行结果:

shell 复制代码
-20

4.2 平台差异

在 windows 平台上,使用 os.setPriority() 设置进程优先级时,不一定会设置成对应数值

windows 下执行以下语句:

js 复制代码
const os = require('os');

os.setPriority(-2);

console.log(os.getPriority(process.pid));

结果:

shell 复制代码
-7

这是因为在 windows 上,优先级对应 6 种不同的等级:

由于 -2 小于 0,判断为高于正常,而高于正常实际对应的值为 -7,所以代码最终打印值为 -7。

我们也可以使用 windows 平台的优先级别名来定义:

js 复制代码
const os = require('os');

os.setPriority(os.constants.priority.PRIORITY_ABOVE_NORMAL);

console.log(os.getPriority(process.pid));

结果:

shell 复制代码
-7

我们打印下 os.constants.priority 看看:

js 复制代码
const os = require("os");

console.log(os.constants.priority);

结果:

shell 复制代码
[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. 生产中的作用

  1. 用法一

    对本系统进程优先级作修改,以在系统资源分配上获取优势

    js 复制代码
    const os = require('os');
    
    os.setPriority(os.constants.priority.PRIORITY_HIGH);
  2. 用法二

    对本系统生成的子进程作优先级调节

    js 复制代码
    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. 重点1

    优先级越高,其对应的值越小,值的范围是 [-20, 19]

  2. 重点2

    windows 平台上,优先级分 6 个档次

相关推荐
jackyChan6 分钟前
ES6 Proxy 性能问题,你真知道吗?🚨
前端·javascript
我命由我1234542 分钟前
Vue 开发问题:Missing required prop: “value“
开发语言·前端·javascript·vue.js·前端框架·ecmascript·js
16年上任的CTO42 分钟前
一文讲清楚React中的key值作用与原理
前端·javascript·react.js·react key
阳火锅1 小时前
在生产环境下,你真的有考虑到使用数组方法的健壮性吗?
前端·javascript·面试
孤月葬花魂1 小时前
JavaScript 中的 Promise API 全面解析
前端·javascript
几道之旅1 小时前
Electron 应用打包全指南
前端·javascript·electron
shushushu1 小时前
Web如何自动播放音视频
前端·javascript
前端进阶者1 小时前
天地图InfoWindow插入React自定义组件
前端·javascript
扶我起来还能学_1 小时前
uniapp Android&iOS 定位权限检查
android·javascript·ios·前端框架·uni-app
爱学习的茄子2 小时前
JavaScript闭包实战:防抖的优雅实现
前端·javascript·面试