多进程处理一个excel

112 阅读2分钟

多进程方式

def process_row_process(sheet,start_row,end_row):
    print(start_row,end_row)
    for row in sheet.iter_rows(values_only=True, min_row=start_row, max_row=end_row):
        # 假设我们只关心第一列的值
        value = row[0]
        # 这里可以是对 value 的处理,例如打印或保存
        print(value)  # 只在需要时打印
        # 进一步处理行的逻辑...





# num_procs为进程数
def detail_excel_file_multiprocess(excel_path, num_procs=10):
    # 加载工作簿
    workbook = openpyxl.load_workbook(excel_path)
    sheet =  workbook['Sheet']

    # 获取总行数
    total_rows = sheet.max_row

    # 分割任务
    # 如果总行数为 1000,num_process为10,那么表示每次处理100行
    # // 是一个整数除法运算符,也称为地板除法。它会将两个操作数进行除法运算,并返回结果的整数部分,忽略小数部分。
    rows_per_process = total_rows // num_procs
    processes = []
    # 创建并启动进程
    for i in range(num_procs):
        # 循环时从索引0开始
        start_row = i * rows_per_process + 1
        # 当 i 不是最后一个进程时,end_row 是最后一行的前一行
        end_row = start_row + rows_per_process-1 if i < num_procs - 1 else total_rows
        p = Process(target=process_row_process, args=(sheet,start_row,end_row))
        processes.append(p)
        p.start()


    # 等待所有进程完成
    for p in processes:
        p.join()

    # 保存修改后的工作簿
    workbook.save(excel_path)
    print('成熟度编辑完成')

进程池方式

def process_row_process_pool(args):
    # 接收一个元组参数
    sheet,start_row,end_row = args
    # 假设 get_maturity 函数已经在其他地方定义,并且可以处理 row 中的数据
    print(start_row, end_row)
    for row in sheet.iter_rows(values_only=True, min_row=start_row, max_row=end_row):
        # 假设我们只关心第一列的值
        value = row[0]
        # 这里可以是对 value 的处理,例如打印或保存
        print(value)  # 只在需要时打印
        # 进一步处理行的逻辑...
def detail_excel_file_process_pool(excel_path,num_procs=10):
    # 获取excel文档对象
    workbook = openpyxl.load_workbook(excel_path)
    # 获取excel文档对象的表格对象
    sheet = workbook['Sheet']

    # 获取总行数
    total_rows = sheet.max_row

    # 分割任务
    rows_per_process = total_rows // num_procs
    # 使用进程池来处理每一行
    with Pool(processes=num_procs) as pool:
        for i in range(num_procs):
            # 计算每个进程的任务范围
            start_row = i * rows_per_process + 1
            end_row = start_row + rows_per_process - 1 if i < num_procs - 1 else total_rows
            # 分配任务给进程池
            pool.map(process_row_process_pool, [(sheet, start_row, end_row)])

    # 保存修改后的工作簿
    workbook.save(excel_path)
    print('成熟度编辑完成')