请教大牛们有关 NodeJs 多线程的问题,现在你们都是用的哪个库呢?
请教大牛们有关 NodeJs 多线程的问题,现在你们都是用的哪个库呢?
网上看的例子,如下,准备改造成多线程的方式。 tagg2 安装编译失败,tagg 不支持 windows。
var express = require('express');
var app = express();
var fibo = function fibo(n) {
return n > 1 ? fibo(n - 1) + fibo(n - 2) : 1;
}
app.get('/', function(req, res) {
var n = fibo(~~req.query.n || 1);
res.send(n.toString());
});
app.listen(8124);
当遇到大数字的时候,一个用户就会导致 cpu 满掉,其他用户就会响应不了请求了。 应该怎么解决这个问题呢?
看下 cluster 能不能解决你的需求?
感觉这个的提升不是很大,cpu 的核数相关(我是双核的机器),第三个用户出现的时候还是会悲剧。<br>var cluster = require('cluster');<br>var numCPUs = require('os').cpus().length;<br>if (cluster.isMaster) {<br> for (var i = 0; i < numCPUs; i++) {<br> cluster.fork();<br> }<br>} else {<br> var express = require('express');<br> var app = express();<br> var fibo = function fibo (n) {<br> return n > 1 ? fibo(n - 1) + fibo(n - 2) : 1;<br> }<br> app.get('/', function(req, res){<br> var n = fibo(~~req.query.n || 1);<br> res.send(n.toString());<br> });<br> app.listen(8124);<br> console.log('listen on 8124');<br>}<br>
结果缓存起来啊。。
额。。把递归改成动态规划就解决了啊
这种 cpu-bound 的业务逻辑,开大于核心数的线程是没用的
这是个好思路,感谢。
不过还是想再了解一下 Node.js 多线程的东西。
用了 npm 上 fibers,可能是姿势不对,貌似没提升。
感谢指点
node 上用多线程的原因大部分是逻辑需要,而不是性能需要。
单纯的性能需求用 cluster 就好了。
不要用递归就好了
多起几个实例 用 pm2 管理 在实例上层做负载均衡 这样的话代码层面就不用改动了
谢谢各位大佬的指点。
小弟茅塞顿开!
关于Node.js多线程的问题,目前主要有几种解决方案,其中使用库来处理是较为常见的方法。以下是一些推荐的库及其简要说明:
-
worker_threads:
- Node.js官方提供的模块,用于创建和管理线程。
- 示例代码:
const { Worker, isMainThread, parentPort } = require('worker_threads'); if (isMainThread) { // 主线程代码 const worker = new Worker(__filename); worker.on('message', (message) => console.log(message)); } else { // Worker线程代码 parentPort.postMessage('Hello from worker'); }
-
nPool:
- 专为Node.js设计的扩展库,引入线程池概念,提升并发任务处理效率。
- 支持自定义上下文环境,适应多变应用场景。
-
nodejs-threadpool:
- 基于worker_threads模块的线程池库。
- 适用于处理耗时操作或Node.js未提供异步模式的API。
- 支持自定义线程池参数,如核心线程数、最大线程数等。
综上所述,对于Node.js多线程问题,可以根据具体需求选择合适的库进行处理。worker_threads作为官方模块,稳定性和兼容性较好;而nPool和nodejs-threadpool则提供了更高级的线程池管理功能。