使用wget并行下载数千个文件遇卡顿问题求助
问题分析与解决方案
原代码存在的问题
- 多进程任务分配不合理:原代码将URL批量传给子进程,单个进程需处理多个下载任务,结合
subprocess.call的阻塞特性,易造成资源集中占用引发系统卡顿。 - 变量名错误:
doers函数中使用未定义的authorization变量,实际应为header,会导致子进程调用报错但无输出提示。 - Windows多进程启动问题:未用
if __name__ == '__main__':包裹主逻辑,触发重复创建进程的问题,导致系统卡顿且无下载结果。 - 任务类型适配错误:下载属于IO密集型任务,多进程的进程切换开销远大于多线程,用多线程更高效。
方案一:多线程下载(推荐)
IO密集型任务优先用多线程,进程切换开销小,资源占用更低:
import os import subprocess from concurrent.futures import ThreadPoolExecutor header = "authorizationkey" rd = '.\\results\\' app = r"C:\Users\daniel\Downloads\wget.exe" # 提前创建保存目录,避免wget报错 os.makedirs(rd, exist_ok=True) def download_single_url(url): try: # 屏蔽wget的输出,减少系统资源占用 subprocess.call([ app, '--header', header, '-P', rd, url ], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) print(f"完成下载: {url.split('/')[-1]}") except Exception as e: print(f"下载失败 {url.split('/')[-1]}: {str(e)}") # 根据网络带宽调整线程数,建议10-20 with ThreadPoolExecutor(max_workers=15) as executor: executor.map(download_single_url, urls)
方案二:修正后的多进程代码
如果坚持用多进程,需修正任务分配和启动逻辑:
import os import subprocess import multiprocessing as mp header = "authorizationkey" rd = '.\\results\\' app = r"C:\Users\daniel\Downloads\wget.exe" os.makedirs(rd, exist_ok=True) def download_single_url(url): try: subprocess.call([ app, '--header', header, '-P', rd, url ], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) print(f"完成下载: {url.split('/')[-1]}") except Exception as e: print(f"下载失败 {url.split('/')[-1]}: {str(e)}") # Windows下必须用该判断包裹多进程主逻辑 if __name__ == '__main__': num_processes = mp.cpu_count() - 1 with mp.Pool(num_processes) as pool: pool.map(download_single_url, urls)
额外优化建议
- 屏蔽wget的标准输出和错误输出,避免大量日志占用系统资源。
- 并发数不要设置过高,网络带宽有限,过多并发会导致单任务下载速度下降,反而降低整体效率。
- 可添加断点续传参数
-c到wget命令中,避免中断后重新下载整个文件。
内容的提问来源于stack exchange,提问作者Yuqi
相关产品推荐
相关产品推荐

