Ben Noordhius 在 Node v0.10.0 中所做的更改之一是在 Unix 中“尊重 UV_THREADPOOL_SIZE 环境变量”。“threadpool.c”源文件似乎就是这样做的。
如果我不设置这个 env 变量,我可以验证我被限制为 4 个线程的线程池,这是线程池的默认大小。
但是我在我的 Linux 服务器上将此环境变量设置为 64,然后重新启动 Node,但我似乎仍然受到限制,似乎是大小为 5 的线程池?!
这对任何人都有意义吗?谢谢!
Ben Noordhius 在 Node v0.10.0 中所做的更改之一是在 Unix 中“尊重 UV_THREADPOOL_SIZE 环境变量”。“threadpool.c”源文件似乎就是这样做的。
如果我不设置这个 env 变量,我可以验证我被限制为 4 个线程的线程池,这是线程池的默认大小。
但是我在我的 Linux 服务器上将此环境变量设置为 64,然后重新启动 Node,但我似乎仍然受到限制,似乎是大小为 5 的线程池?!
这对任何人都有意义吗?谢谢!
看来您必须使用 node 命令或从 node 程序内部将其设置为 var 。像这样执行它:
UV_THREADPOOL_SIZE=64 node
或从程序修改:
process.env.UV_THREADPOOL_SIZE=64
//then execute some function that requires threadpool
require('fs').readFile('testing',function(){});
测试线程:
ps -Lef | grep "\<node\>" | wc -l
67
如果您运行的是 Windows 操作系统并通过 .js 文件运行,则需要在UV_THREADPOOL_SIZE
通过节点调用脚本之前设置。
cmd中的示例:(SET UV_THREADPOOL_SIZE=2 && node my-file-to-run.js
周围没有空格=
)
或在 Powershell 中:$env:UV_THREADPOOL_SIZE = 2 && node my-file-to-run.js
确保您永远不会将 UV_THREADPOOL_SIZE 设置为大于您拥有的核心处理器数量的数字,因为这会增加上下文切换,从而影响您的应用程序的性能。
const OS = require('os');
process.env.UV_THREADPOOL_SIZE = OS.cpus().length;
上述说法是不正确的。libuv
如果底层操作系统服务执行它自己的非阻塞策略,则不使用。如果底层 OS 服务阻塞,节点实现通常会将操作包装为async
使用线程并继续在主线程上执行其他 JS 代码。
上下文切换不会发生,因为更多或更少的线程可用。拥有更多线程的唯一副作用是分配了一些内存。
可以加载的本机库,通常也使用libuv
. libuv
例如,Oracle 节点驱动程序手册中有一章。其中特别指出,Oracle 驱动程序在libuv
线程中与数据库执行交换 - 因此要打开多个与数据库的连接并进行工作,强烈建议使用 upprocess.env.UV_THREADPOOL_SIZE
另请注意下面这行代码,完全错误,必须在节点启动前设置,从节点内部设置无效。
process.env.UV_THREADPOOL_SIZE = OS.cpus().length;