var request = require(‘superagent’); var async = require(‘async’);
var tasks = [ ‘http://www.baidu.com’, ‘http://www.baidu.com’, ‘http://www.baidu.com’, ‘http://www.baidu.com’, ‘http://www.baidu.com’, ‘http://www.baidu.com’, ];
setInterval(function() { async.map(tasks, function(task, callback) { request .get(task) .end(function(err, res) { callback(err, res); }); }, function(err, res) { }) }, 1000);
你用async.mapLimit控制下并发试试。 我之前写个简单的跟你这有点类似的东西 https://github.com/luoyjx/tag-spider
@luoyjx 试过,好像不管用
正常, Node.js 就这样,GC触发的比较慢。 如果实在看不下去了可以在启动的时候加上v8参数 --expose-gc, 然后在程序里自己手动 gc
setInterval(function() {
async.map(tasks, function(task, callback) {
request
.get(task)
.end(function(err, res) {
callback(err, res);
});
}, function(err, res) {
gc();
console.log(process.memoryUsage());
})
}, 1000);
- 涨没有事,关键是你程序跑完后多长时间内存是否还是占用,这才是确定是否是内存泄露。 如果程序跑完一分钟内,内存下去了。就不是内存问题
- 楼主这样的程序,在执行的时候肯定内存一直在攀升。关键是你如何控制在你想控制的范围内, 因为请求到的东西一直存在内存里。处理完后等待GC
@struCoder 内存一直占用,直到爆炸!!!
@wyvernnot 我看看……
别用setInterval,用node-schedule试试
时间设置太短了
@wldlzt 这两个有什么区别吗
async.map 一直在new数组,前一个map的所有请求没有完全响应,它new的数组就不会被GC,你后面的map又来了,越积越多,最后挂掉。如8楼所说,把时间设置的长一些或许会管用。最好还是用类似async.waterfall把map串起来,或者Limit所有任务,而不是setInterval里面的部分任务。
用setTimeout尾回调,就不会回调堆积了