
网上看的例子,如下,准备改造成多线程的方式。 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 满掉,其他用户就会响应不了请求了。 应该怎么解决这个问题呢?
1 ufo22940268 2017-07-19 17:22:13 +08:00 看下 cluster 能不能解决你的需求? |
2 de6ugger OP @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'); } ``` |
3 Mirana 2017-07-19 17:40:37 +08:00 结果缓存起来啊。。 |
4 cloud107202 2017-07-19 17:54:13 +08:00 额。。递归改成动态规划就解决了啊 这种 cpu-bound 的业务逻辑,开大于核心数的线程是没用的 |
5 de6ugger OP |
6 de6ugger OP @cloud107202 感谢指点 |
7 plqws 2017-07-19 18:13:15 +08:00 node 上用多线程的原因大部分是逻辑需要,而不是性能需要。 单纯的性能需求用 cluster 就好了。 |
8 6324tv 2017-07-19 21:24:40 +08:00 不要用递归就好了 |
9 xmadi 2017-07-19 21:31:57 +08:00 via iPhone 多起几个实例 用 pm2 管理 在实例上层做负载均衡 这样的话代码层面就不用改动了 |
10 qiuyk 2017-07-20 08:54:23 +08:00 你这个线程再多也是 cpu 密集问题 一样会卡死的= = 一般是 io 密集才考虑多线程的解决方案 cpu 密集你只能改进算法了 用空间换时间咯 不过计算量太大一样会有种卡卡的感觉 或者... 换电脑吧(逃) |