请教大牛们有关 NodeJs 多线程的问题,现在你们都是用的哪个库呢?

发布于 1周前 作者 vueper 来自 nodejs/Nestjs

请教大牛们有关 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 满掉,其他用户就会响应不了请求了。 应该怎么解决这个问题呢?


12 回复

看下 cluster 能不能解决你的需求?



感觉这个的提升不是很大,cpu 的核数相关(我是双核的机器),第三个用户出现的时候还是会悲剧。
<br>var cluster = require('cluster');<br>var numCPUs = require('os').cpus().length;<br>if (cluster.isMaster) {<br> for (var i = 0; i &lt; 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 &gt; 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 管理 在实例上层做负载均衡 这样的话代码层面就不用改动了

你这个线程再多也是 cpu 密集问题 一样会卡死的= =

一般是 io 密集才考虑多线程的解决方案 cpu 密集你只能改进算法了 用空间换时间咯 不过计算量太大一样会有种卡卡的感觉

或者…

换电脑吧(逃)





谢谢各位大佬的指点。
小弟茅塞顿开!

关于Node.js多线程的问题,目前主要有几种解决方案,其中使用库来处理是较为常见的方法。以下是一些推荐的库及其简要说明:

  1. 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');
    }
    
  2. nPool

    • 专为Node.js设计的扩展库,引入线程池概念,提升并发任务处理效率。
    • 支持自定义上下文环境,适应多变应用场景。
  3. nodejs-threadpool

    • 基于worker_threads模块的线程池库。
    • 适用于处理耗时操作或Node.js未提供异步模式的API。
    • 支持自定义线程池参数,如核心线程数、最大线程数等。

综上所述,对于Node.js多线程问题,可以根据具体需求选择合适的库进行处理。worker_threads作为官方模块,稳定性和兼容性较好;而nPool和nodejs-threadpool则提供了更高级的线程池管理功能。

回到顶部