网上看的例子,如下,准备改造成多线程的方式。 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 密集你只能改进算法了 用空间换时间咯 不过计算量太大一样会有种卡卡的感觉 或者... 换电脑吧(逃) |