Ben Noordhius在Node v0.10.0中所做的更改之一是在Unix中“荣誉UV_THREADPOOL_SIZE环境变量”。“threadpool.c”源文件似乎就是这样做的。如果我不设置这个env变量,我可以验证我被限制为4个线程的线程池,这是线程池的默认大小。但是我在Linux服务器上将这个环境变量设置为64,然后重新启动Node,但我似乎仍然受到限制,似乎线程池的大小为5?!这对任何人都有意义吗?谢谢!
j8ag8udp1#
看起来你必须用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
aamkag612#
如果您运行的是Windows操作系统并通过.js文件运行,则需要在通过node调用脚本之前设置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
SET UV_THREADPOOL_SIZE=2 && node my-file-to-run.js
=
$env:UV_THREADPOOL_SIZE = 2 && node my-file-to-run.js
o0lyfsai3#
在Windows操作系统中,您需要在通过命令行中的节点调用脚本之前设置UV_THREADPOOL_SIZE。例如$env:UV_THREADPOOL_SIZE = 5; node script.js
$env:UV_THREADPOOL_SIZE = 5; node script.js
l3zydbqr4#
请确保您从未将UV_THREADPOOL_SIZE设置为大于您拥有的核心处理器数量的数字,因为这将增加上下文切换,从而影响应用的性能。
const OS = require('os'); process.env.UV_THREADPOOL_SIZE = OS.cpus().length;
a6b3iqyw5#
上述说法不正确。如果底层OS服务执行自己的非阻塞策略,则不使用libuv。如果底层OS服务阻塞,节点实现通常会使用线程将操作 Package 为async,并继续在主线程上执行其他JS代码。上下文切换不会发生,因为有更多或更少的线程可用。拥有更多线程的唯一副作用是分配了一些RAM。可以加载的本地库通常也使用libuv。例如,Oracle节点驱动程序手册中有一章是关于libuv的。这里要特别注意的是,Oracle驱动程序在libuv线程中执行与DB的交换-因此,要打开多个到DB的连接并进行工作,强烈建议使用process.env.UV_THREADPOOL_SIZE也请注意下面的代码行,它是完全错误的,你必须在节点启动之前设置它,在节点内设置它没有效果。
libuv
async
process.env.UV_THREADPOOL_SIZE
process.env.UV_THREADPOOL_SIZE = OS.cpus().length;
5条答案
按热度按时间j8ag8udp1#
看起来你必须用node命令或从node程序内部设置它的var。执行如下:
或从程序修改:
测试螺纹:
aamkag612#
如果您运行的是Windows操作系统并通过.js文件运行,则需要在通过node调用脚本之前设置
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
o0lyfsai3#
在Windows操作系统中,您需要在通过命令行中的节点调用脚本之前设置UV_THREADPOOL_SIZE。
例如
$env:UV_THREADPOOL_SIZE = 5; node script.js
l3zydbqr4#
请确保您从未将UV_THREADPOOL_SIZE设置为大于您拥有的核心处理器数量的数字,因为这将增加上下文切换,从而影响应用的性能。
a6b3iqyw5#
上述说法不正确。如果底层OS服务执行自己的非阻塞策略,则不使用
libuv
。如果底层OS服务阻塞,节点实现通常会使用线程将操作 Package 为async
,并继续在主线程上执行其他JS代码。上下文切换不会发生,因为有更多或更少的线程可用。拥有更多线程的唯一副作用是分配了一些RAM。
可以加载的本地库通常也使用
libuv
。例如,Oracle节点驱动程序手册中有一章是关于libuv
的。这里要特别注意的是,Oracle驱动程序在libuv
线程中执行与DB的交换-因此,要打开多个到DB的连接并进行工作,强烈建议使用process.env.UV_THREADPOOL_SIZE
也请注意下面的代码行,它是完全错误的,你必须在节点启动之前设置它,在节点内设置它没有效果。