Why co use too many memory

var co = require('co');
var urllib = require('urllib');

var count = 0;
co(function* () {
  while (true) {
    try {
      yield urllib.request('http://www.baidu.com');
    } catch (err) {
      console.error(err.message);
    }
    yield sleep(10);
    // global.gc();
    console.log('run %d, %smb', count++, process.memoryUsage().rss / 1024 / 1024);
  }
}).catch(function (err) {
  throw err;
});

function sleep(ms) {
  return function (callback) {
    setTimeout(callback, ms);
  };
}
var co = require('co');
var urllib = require('urllib');

var count = 0;
var running = false;

function* start() {
  if (running) {
    return;
  }
  running = true;
  var r;
  try {
    r = yield urllib.requestThunk('http://www.baidu.com');
  } catch (err) {
    console.error(err.message);
  } finally {
    running = false;
  }
  count++;
  if (count % 10 === 0) {
    console.log('run %d, %j, %smb',
      count, r && r.status, process.memoryUsage().rss / 1024 / 1024);
  }
}

var fn = co.wrap(start);

setInterval(function () {
  fn.call(null).catch(function (err) {
    throw err;
  });
}, 10);
var http = require('http');
var co = require('co');
var urllib = require('urllib');

var counts = {
  0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0
};
var running = false;

function get(url) {
  return function (callback) {
    http.get(url, function(res) {
      var size = 0;
      res.on('data', function (data) {
        size += data.length;
      }).on('end', function () {
        callback(null, {
          size: size,
          statusCode: res.statusCode
        });
      });
    }).on('error', callback);
  };
}

function getPromise(url) {
  return new Promise(function(resolve, reject) {
    http.get(url, function(res) {
      var size = 0;
      res.on('data', function (data) {
        size += data.length;
      }).on('end', function () {
        resolve({
          size: size,
          statusCode: res.statusCode
        });
      });
    }).on('error', reject);
  });
}

function* start(index) {
  if (running) {
    return;
  }
  running = true;
  var r;
  try {
    r = yield urllib.request('http://127.0.0.1:7001');
    // r = yield get('http://127.0.0.1:7001/');
    // r = yield getPromise('http://127.0.0.1:7001/');
  } catch (err) {
    console.error(err.message);
  } finally {
    running = false;
  }
  counts[index]++;
  if (counts[index] % 100 === 0) {
    console.log('[#%d] run %d, %s:%s, %smb',
      index, counts[index], r && r.status, r && r.size, process.memoryUsage().rss / 1024 / 1024);
  }
}

var fn = co.wrap(start);

setInterval(function () {
  fn.call(null, 1).catch(function (err) {
    throw err;
  });
}, 10);
setInterval(function () {
  fn.call(null, 2).catch(function (err) {
    throw err;
  });
}, 10);
setInterval(function () {
  fn.call(null, 3).catch(function (err) {
    throw err;
  });
}, 10);
setInterval(function () {
  fn.call(null, 4).catch(function (err) {
    throw err;
  });
}, 10);
setInterval(function () {
  fn.call(null, 5).catch(function (err) {
    throw err;
  });
}, 10);
setInterval(function () {
  fn.call(null, 6).catch(function (err) {
    throw err;
  });
}, 10);

Comments

Fork me on GitHub