Node.js http请求内存和cpu hog

| 我有一个连续请求页面的node.js脚本,有点像cron作业。 但是,几分钟后,Node开始使用大量CPU(最多70%)和内存(最多200mb)。 我的脚本有什么问题?
function cron(path)
{
    var http = require(\'http\');
    var site = http.createClient(443, \'www.website.com\', true);
    var request = site.request(\'GET\', path, {\'host\': \'www.website.com\'});
    request.end();

    request.on(\'response\', function (response) {

        setTimeout(function(){cron(path)},15000);
    });


}

cron(\'/path/to/page\');
    
已邀请:
request.on(\'response\', function (response) {
    setTimeout(function(){cron(path)},15000);
});
对于每个答复,您都将创建一个新的“ 2”职位。记录您的回复。如果您从请求中得到的值大于1,那么您将以指数方式创建更多的cron作业。 您参考
path
创建了
function() {}
。因此,将保留整个范围状态。您要添加以下内容来释放内存:
var site = null;
var request = null;
您在函数内部而不是模块范围外部调用
require(\"http\")
。您只需要获得一次ѭ7,就可以放在模块作用域中文件的顶部。
var http = require(\'http\');
var site = http.createClient(443, \'www.website.com\', true);
function cron(path)
{

    var request = site.request(\'GET\', path, {\'host\': \'www.website.com\'});
    request.end();

    var once = true;
    request.on(\'response\', doIt);

    function doIt(response) {
        if (!once) {
            once = null;
            doIt = function() {};
            setTimeout(function(){cron(path)},15000);
        }
    });

    site = null;
    request = null;
}

cron(\'/path/to/page\');
    
除了@Raynos的提示,这里还有另一个。我发现在长时间运行的过程中像这样的递归调用使我有些紧张,所以我宁愿改用setInterval。我可能会将cron和http行为分开,以防您想尝试并重用该逻辑,尽管这将取决于您的上下文: 例如在节点0.4.7中:
var https = require(\'https\');

function poll(path)
{
    https.get({
        host: \'www.website.com\',
        port: 443,
        path: path
    }, function(res) {
        console.log(\"Got response: \" + res.statusCode);
    }).on(\'error\', function(e) {
        console.log(\"Got error: \" + e.message);
    });

}

function cron(path)
{
    return setInterval(function(){
        poll(path);
    },15000);
}

var intervalId = cron(\'/path/to/page\'); // keep in case you need to use clearInterval
    

要回复问题请先登录注册