我有一个node.js脚本,它连续请求一个页面,有点像cron作业。
然而,几分钟后,节点开始使用大量的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);
});

为每个响应创建一个新的cron作业。记录你的回答。如果你从你的请求中得到了多于1的信息,那么你将创建更多的cron作业。
创建一个引用function() {}path。所以整个作用域状态保持不变。要释放内存,请添加以下内容:
var site = null;
var request = null;

在函数内部调用,而不是在模块范围外部调用。您只需要得到require("http")一次,因此将其放在模块范围内的文件顶部。
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');

09-10 10:20
查看更多