其实不是阻塞,但不知道怎么用一句话描述,具体现象后面有详细讲。
用的是 request. 伪代码如下
let count = 100;
function batch() {
  // 从数据库用 SELECT ... LIMIT 100 取出 100 条 url
  for (let url in urlList) {
    const req = request(...);
    req.on('error', () => {
      // 一些其它操作
      count--;
      if (count === 0) {
        count = 100;
        batch();
      }
    });
    req.on('end', () => {
      // 一些其它操作
      count--;
      if (count === 0) {
        count = 100;
        batch();
      }
    });
  }
第一波发出去的请求是正常的,过了几波后,在创建完 request, 控制权交还给事件循环时, 要等好长时间才会开始发请求,这个等待的时间会越来越久。试过调整连接池,但只能缓解,不能解决。
大家有没有碰到过类似的问题?或者有没有排查问题的思路?
|  |      1magicdawn      2016-06-17 21:56:09 +08:00 batch 里的循环没有引用 count, 在 error/end 修改 end 有什么用... 你这样一下创建了 n 多请求, 会导致系统打开的 fd 急剧增加... 如果你是使用 callback 的话可以使用 async.parallelLimit, see https://github.com/caolan/async#paralleltasks-callback promise, co, 或者 async/await 可以使用 promise.map 控制下并发, see https://github.com/magicdawn/promise.map | 
|  |      2magicdawn      2016-06-17 21:57:30 +08:00 > 在 error/end 修改 end 有什么用...  在 error/end 修改 count 有什么用... |