先说一下逻辑。
是这样的,项目需要下载远程目录里的一个文件夹,远程服务器丢回来的是一个数组,数组是这样的形式
data:[{
name:xxx,
url:"http://xxx.xxx/xx/xx.jpg"
},...]
我拿到这个数组首先想到的是遍历它,然后依次request + pipe它就可以了,相当于下载完一个,回调下一个,出错就直接终止,没有任何问题。
为了加快速度,最大利用带宽,我就想到了同时发起多个请求,像这样
// 确定开启的线程数
let threadNum = 10
for (var i = 0; i < threadNum; i++) {
downloadfiles(i, fileArr)
}
downloadfiles是一个递归算法,这里我就不多讲了,总之就是同时发起10个请求,把文件下载完成。我所设想的是,如果下载失败会重新调用重新下载。超过3次就自动挂起,让所有下载终止,并告诉用户下载失败检查网络环境。。
然后问题就来了。。。。如果其中的一个下载线程失败了,我如何才能让其它的下载线程终止呢?
我用的是request库,真的要做也不是不行,就是for循环一次把所有request的对象abort(),但总觉得不那么正常,而且会有点问题。
之后想到用node的child_process也许可行,但是我需要给子进程传文件的队列,这里就不怎么了解了。
各路大神给点建议。。。
已用child_process解决。。