其实不是阻塞,但不知道怎么用一句话描述,具体现象后面有详细讲。
用的是 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, 控制权交还给事件循环时, 要等好长时间才会开始发请求,这个等待的时间会越来越久。试过调整连接池,但只能缓解,不能解决。
大家有没有碰到过类似的问题?或者有没有排查问题的思路?
1
magicdawn 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 |
2
magicdawn 2016-06-17 21:57:30 +08:00
> 在 error/end 修改 end 有什么用...
在 error/end 修改 count 有什么用... |