爬虫多线程卡死或阻塞,程序无法异常终止

关于m3u8格式视频多线程下载及合并的详解,在以前博客里记录过
最近突发奇想,准备搞点非正规电影网站的资源下载器,在进行第一个网站时,可能因为该网站通信质量差,导致我多线程卡死,阻塞了
研究了一下网上资料以及自己的代码,已经解决了,下面是思路
当线程卡死或者阻塞时,应首先考虑网络或者其他异常导致请求无法自动判定为超时,挂掉该线程,而是使线程一直处于卡死状态
当手动加上超时时间,就可以大概率解决该异常
从某种程度上来说,我们做请求时,都应该加上超时限制,不然代码卡在奇怪的地方,还要分析好久
任何一个ts文件下载失败了都会导致最终视频无法合成,所以理论上,失败就重新入队,目前暂时未发现无限入队重试的情况
def down(ts_queue, headers):
    tt_name = threading.current_thread().getName()
    while True:
        if ts_queue.empty():
            break
        url = ts_queue.get()
        filename = re.search('([a-zA-Z0-9-_]+.ts)', url).group(1).strip()
        try:
            requests.packages.urllib3.disable_warnings()
            r = requests.get(url, stream=True, headers=headers, verify=False, timeout=5)
            with open('cache/' + filename, 'wb') as fp:
                for chunk in r.iter_content(5424):
                    if chunk:
                        fp.write(chunk)
            logging.info('[url] %s [线程] %s [文件下载成功] %s',url, tt_name, filename)
        except Exception as e:
            ts_queue.put(url)
            logging.info('[ERROR] %s [文件下载失败,入队重试] %s', e, filename)

 

你可能感兴趣的:(爬虫实战)