【悄咪咪学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 个档次

相关推荐
G等你下课3 分钟前
告别刷新就丢数据!localStorage 全面指南
前端·javascript
爱编程的喵7 分钟前
JavaScript闭包实战:从类封装到防抖函数的深度解析
前端·javascript
前端Hardy12 分钟前
8个你必须掌握的「Vue」实用技巧
前端·javascript·vue.js
星月日16 分钟前
深拷贝还在用lodash吗?来试试原装的structuredClone()吧!
前端·javascript
爱学习的茄子17 分钟前
JavaScript闭包实战:解析节流函数的精妙实现 🚀
前端·javascript·面试
今夜星辉灿烂29 分钟前
nestjs微服务-系列4
javascript·后端
吉吉安32 分钟前
两张图片对比clip功能
javascript·css·css3
布兰妮甜42 分钟前
开发在线商店:基于Vue2+ElementUI的电商平台前端实践
前端·javascript·elementui·vue
Jinxiansen02111 小时前
Vue 3 中父子组件双向绑定的 4 种方式
javascript·vue.js·ecmascript
木依1 小时前
Vue3 Element plus table有fixed列时错行
javascript·vue.js·elementui