各位对于并发控制有什么好的方法没有?我写的蹩脚大水逼代码,我自己都不想看
发布于 6天前 作者 Pcman1056 242 次浏览 来自 问答

看着自己写的并发控制,虽然有效果,但。。。太蹩脚了。。。自己都想笑 ^^ ^^ ,你们有什么好的方法让我借鉴一下?

        downloadList.push(url);
        downloadDir.push(dir);
        console.log("待下载数量:"+downloadList.length);  
var down=function(){
    console.log("正在下载数量"+streamNumber);
    while(downloadList.length&&(streamNumber<streamLimit)){
        streamNumber++;
        var url=downloadList.pop();
        download(url,downloadDir.pop(),Math.floor(Math.random()*100000) + url.substr(-4,4),function(err){
            if(err){
                console.log(err);
            }
            streamNumber--;
            console.log("下载了"+(downloadAll++)+"张图片");
        });
    }
}

var download = function(url, dir, filename,cb){
        var stream=fs.createWriteStream(dir + "/" + filename);
        stream.on("error",function(err){
            if(err){
                cb(err+"ssssssssssssssssss");
            }
        });     
        var r=request.get({
          url: url,
          headers: {
            'referer': 'http://www.dgtle.com/'
          }
        });
        r.on("error",function(err){
            if(err){
                cb(err+"rrrrrrrrrrrrrrrrrrr");
            }
        });
        r.pipe(stream);
        r.on("end",function(){      
            cb(null)
        });
};


setInterval(function(){
    console.log("--------------------");
    down();
},1000);
8 回复

已经控制到20了,怎么还会有错??? 无标题.png

看看我写的:

http://github.com/guotie/spider

中的queue.js,这个是从async库的queue抄过来的,不过增加了每秒钟最大请求次数的限制。

while还是不要用了,可以用events.EventEmitter和process.nexttick封装个算法,跟读文件IO类似

@luoyjx 哎呀,这么多好东西,以前都没看到,,,谢啦

Generator + Promise = co + bluebird

yield Promise = await Task<T>

回到顶部