You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用多进程并行化批量图片缩放?遇BrokenProcessPool错误求解决

图片缩放并行化问题修复

错误原因分析

  • 传入executor.map的是文件名而非完整文件路径,导致cv2.imread无法找到图片,子进程因报错异常终止
  • 未检查Resized目录是否存在,若目录不存在会导致图片保存失败
  • Windows环境下使用ProcessPoolExecutor未加if __name__ == '__main__'保护,会触发进程创建异常

修正后的完整代码

调整函数逻辑并补充必要的防护措施,确保并行处理稳定运行:

import cv2
import os
import concurrent.futures

def resize_image(img_path):
    # 确保输出目录存在,不存在则自动创建
    os.makedirs("Resized", exist_ok=True)
    # 获取文件名
    name = os.path.basename(img_path)
    # 读取图片
    img = cv2.imread(img_path)
    # 跳过无法读取的文件(损坏文件或非图片格式)
    if img is None:
        print(f"无法读取文件: {img_path}")
        return
    # 缩放图片并保存
    resized_img = cv2.resize(img, (700, 700))
    cv2.imwrite(os.path.join("Resized", name), resized_img)

if __name__ == '__main__':
    SOURCE_DIRECTORY = "Source/"
    # 生成待处理文件的完整路径列表,仅保留文件(排除子目录)
    file_paths = [
        os.path.join(SOURCE_DIRECTORY, filename)
        for filename in os.listdir(SOURCE_DIRECTORY)
        if os.path.isfile(os.path.join(SOURCE_DIRECTORY, filename))
    ]
    
    # 启动进程池并行处理
    with concurrent.futures.ProcessPoolExecutor() as executor:
        executor.map(resize_image, file_paths)

关键优化说明

  • 完整路径传入:提前生成所有文件的完整路径,避免子进程中出现路径解析错误
  • 目录预检查:用os.makedirs(..., exist_ok=True)确保输出目录存在,无需手动创建
  • 容错处理:检查cv2.imread返回值,跳过无效文件,防止单个文件报错导致整个进程池崩溃
  • 进程环境适配:添加if __name__ == '__main__',解决Windows系统多进程创建的兼容性问题

可选优化:控制进程数量

默认进程池会使用CPU核心数作为进程数量,若磁盘IO是性能瓶颈,可手动指定进程数避免IO过载:

# 限制进程数为4,可根据硬件配置调整
with concurrent.futures.ProcessPoolExecutor(max_workers=4) as executor:
    executor.map(resize_image, file_paths)

内容的提问来源于stack exchange,提问作者FARIS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 05:25:25