我想用 request 做一个类似爬虫程序,需要读一个 urllist (用 linebyline 按行读取),然后请求这些 url ,其中有可能卡住,一直没有返回,所以我设置了 timeout 为 3 秒,并加了重试(我知道有 request-retry ,但它用的也是 request )。
整个程序执行过程应该是这样
1. 读取每行
2. 并开始请求
3. 读取下一行,跳到 1
但我发现在读取行的时候,请求并没有发出去,而是占用了 timeout 的时间,证据就是,当 10 个请求时,很快就全处理完了,当 100 个请求时,有几个请求超时,当 500 个时,大部分都超时了,假如一个请求花 0.1 秒,那执行完 30 个请求后, request 就直接超时了。
矛盾来了,我必须设置超时,如果小了,太多的超时,如果大了,浪费时间。请问这种应该怎么改呢?我只想安安静静地发个请求啊
以下是一个 demo 代码
var request = require('request');
var readline = require('linebyline');
rl = readline(process.stdin);
var res_arr = [];
function get_url(url){
return new Promise(function(resolve, reject) {
var l_options = {'url':url};
l_options.timeout = 3 * 1000;
var st_time = Date.now();
console.error('start request');
request(l_options, function(error, response, body) {
console.error('cost '+(Date.now()-st_time)/1000);
if (error) {
console.error(' ' +l_options.url + ' ' + error);
return ;
}
resolve(body);
});
});
}
rl.on('line', function(line, lineCount, byteCount){
var k = lineCount - 1;
get_url(line).then(function(str){
console.log("body "+str.length);
},
function(str){
console.error("failed "+str);
});
});
像这样执行以上代码cat url.txt | node test.js
,会发现先是输出了一坨"start request"(中间没有任何其他输出),然后开始打印请求的时间,而且可以看出时间越来越大(但不是单调递增的,这点很怪)
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.