Node.js 18中如何通过ES Module设置cluster.schedulingPolicy?
在ES模块中设置Node.js cluster的schedulingPolicy
问题背景
我在集群模式下运行loadtest模块以利用多核资源,发现使用cluster.SCHED_NONE作为调度策略比默认的轮询策略cluster.SCHED_RR运行效率更高。通过外部环境变量设置可以正常生效:
$ NODE_CLUSTER_SCHED_POLICY='none' node bin/testserver.js
但尝试在ES模块(import语法)中直接设置时遇到报错:
import * as cluster from 'cluster' cluster.schedulingPolicy = cluster.SCHED_NONE
报错信息:
TypeError: Cannot assign to read only property 'schedulingPolicy' of object '[object Module]'
单独导入schedulingPolicy也无效;而在代码中先导入cluster再设置process.env['NODE_CLUSTER_SCHED_POLICY'],子进程依然使用默认的cluster.SCHED_RR策略。
解决方案
在ES模块中,cluster模块的导出属性是只读的,无法直接赋值修改。正确的做法是在导入cluster模块之前设置环境变量——因为cluster模块在加载时会读取该环境变量并初始化调度策略:
// 先设置环境变量 process.env.NODE_CLUSTER_SCHED_POLICY = 'none' // 再导入cluster模块 import * as cluster from 'cluster' // 后续集群代码逻辑 if (cluster.isPrimary) { // 主进程逻辑 } else { // 子进程逻辑 }
也可以直接使用cluster.SCHED_NONE的对应值'none'来设置,效果完全一致。这样配置后,cluster模块加载时会应用指定的调度策略,子进程也会遵循该配置运行。
内容的提问来源于stack exchange,提问作者alexfernandez
相关产品推荐
相关产品推荐

