Python如何实现多线程/多进程并发复制多个文件提升拷贝速度
Python多线程并发文件复制方案
文件复制是IO密集型操作,受磁盘/网络IO等待时间影响大,用Python标准库自带的线程池实现并发就能获得明显的速度提升,不需要安装第三方依赖,并发数可以按需调整到10甚至上百,注意不要开过高线程数导致IO争抢反而降速即可。
完整实现代码
import os import shutil from concurrent.futures import ThreadPoolExecutor, as_completed # 基础配置 SOURCE_DIR = "All_files" TARGET_DIR = "part" COPY_FILENAME = "02-Partners.pdf" # 并发线程数,按需调整即可,机械盘建议不超过32,SSD/网络存储可设为64~128 MAX_WORKERS = 32 # 提前创建目标目录,避免路径不存在报错 os.makedirs(TARGET_DIR, exist_ok=True) def single_copy_task(dir_name): """单个文件复制任务,供线程池调用""" src = os.path.join(SOURCE_DIR, dir_name, COPY_FILENAME) if not os.path.exists(src): return None dst = os.path.join(TARGET_DIR, f"{dir_name}_{COPY_FILENAME}") shutil.copyfile(src, dst) return dir_name if __name__ == "__main__": all_dirs = os.listdir(SOURCE_DIR) success_list = [] # 初始化线程池提交所有任务 with ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor: task_map = [executor.submit(single_copy_task, d) for d in all_dirs] # 逐个获取已完成的任务结果 for task in as_completed(task_map): res = task.result() if res: success_list.append(res) # 所有复制任务完成后,统一写入记录文件,避免多线程并发写文件冲突 with open("files.txt", "w", encoding="utf-8") as f: for item in success_list: f.write(f"{item}\n") print(f"任务执行完成,共成功复制{len(success_list)}个文件")
核心改动点说明
- 采用标准库
concurrent.futures.ThreadPoolExecutor做线程池管理,自动处理线程的创建、回收、调度逻辑,仅需修改MAX_WORKERS参数即可调整并发数,支持从几个到上百个并发任务的灵活配置 - 把原逻辑中边复制边写日志的逻辑拆分到主线程串行执行,避免多线程同时写入同一个文件导致的内容错乱、写入丢失问题
- 替换原字符串拼接路径的写法为
os.path.join,自动适配Windows/macOS/Linux不同系统的路径分隔符,减少路径兼容问题 - 新增目标目录预创建逻辑,首次运行时不会因为
part目录不存在抛出文件找不到的错误 - 用
as_completed接收任务返回结果,不需要按任务提交顺序等待,资源利用率更高
性能调优提示
- 存储介质为机械硬盘(HDD)时,不要把并发数设得过高,16~32是比较合理的区间,线程过多会导致磁头频繁寻道,反而拖慢整体复制速度
- 存储介质为固态硬盘(SSD)、或者复制源/目标是网络挂载路径(NAS、对象存储挂载盘等)时,可以把并发数调到64~128,能充分利用带宽提升总复制速度
- 如果需要展示实时进度,可以在任务完成回调里加计数逻辑,注意多线程下共享变量计数要加线程锁避免统计不准
内容的提问来源于stack exchange,提问作者N K
相关产品推荐
相关产品推荐

