V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
de6ugger
V2EX  ›  Node.js

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

  •  
  •   de6ugger · 2017-07-19 17:20:08 +08:00 · 5040 次点击
    这是一个创建于 2691 天前的主题,其中的信息可能已经有所发展或是发生改变。

    网上看的例子,如下,准备改造成多线程的方式。 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 满掉,其他用户就会响应不了请求了。 应该怎么解决这个问题呢?

    11 条回复    2017-07-20 10:05:32 +08:00
    ufo22940268
        1
    ufo22940268  
       2017-07-19 17:22:13 +08:00
    看下 cluster 能不能解决你的需求?
    de6ugger
        2
    de6ugger  
    OP
       2017-07-19 17:38:36 +08:00
    @ufo22940268
    感觉这个的提升不是很大,cpu 的核数相关(我是双核的机器),第三个用户出现的时候还是会悲剧。
    ```
    var cluster = require('cluster');
    var numCPUs = require('os').cpus().length;
    if (cluster.isMaster) {
    for (var i = 0; i < numCPUs; i++) {
    cluster.fork();
    }
    } else {
    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);
    console.log('listen on 8124');
    }
    ```
    Mirana
        3
    Mirana  
       2017-07-19 17:40:37 +08:00
    结果缓存起来啊。。
    cloud107202
        4
    cloud107202  
       2017-07-19 17:54:13 +08:00
    额。。把递归改成动态规划就解决了啊
    这种 cpu-bound 的业务逻辑,开大于核心数的线程是没用的
    de6ugger
        5
    de6ugger  
    OP
       2017-07-19 17:54:31 +08:00
    @Mirana 这是个好思路,感谢。
    不过还是想再了解一下 Node.js 多线程的东西。
    用了 npm 上 fibers,可能是姿势不对,貌似没提升。
    de6ugger
        6
    de6ugger  
    OP
       2017-07-19 17:54:57 +08:00
    @cloud107202 感谢指点
    plqws
        7
    plqws  
       2017-07-19 18:13:15 +08:00
    node 上用多线程的原因大部分是逻辑需要,而不是性能需要。
    单纯的性能需求用 cluster 就好了。
    6324tv
        8
    6324tv  
       2017-07-19 21:24:40 +08:00
    不要用递归就好了
    xmadi
        9
    xmadi  
       2017-07-19 21:31:57 +08:00 via iPhone
    多起几个实例 用 pm2 管理 在实例上层做负载均衡 这样的话代码层面就不用改动了
    qiuyk
        10
    qiuyk  
       2017-07-20 08:54:23 +08:00
    你这个线程再多也是 cpu 密集问题 一样会卡死的= =

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

    或者...

    换电脑吧(逃)
    de6ugger
        11
    de6ugger  
    OP
       2017-07-20 10:05:32 +08:00
    @plqws
    @6324tv
    @xmadi
    @qiuyk
    谢谢各位大佬的指点。
    小弟茅塞顿开!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2804 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 12:43 · PVG 20:43 · LAX 04:43 · JFK 07:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.