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

Python3.7使用multiprocessing并行运行不同函数的问题求助

解决Python多进程并行执行不同函数并获取返回值的问题

你遇到的问题核心是错误使用了multiprocessing.Pool的API,导致无法正确启动并行任务。我来帮你梳理错误点并给出两种可行的解决方案:

原代码的核心错误

你的Pool调用写法完全不符合规范:

result1 = p.map(method1(file_path1), args=file_path1)
result2 = p.map(method2(file_path1), args=file_path2)

这里有两个致命问题:

  1. map的第一个参数必须是函数对象(比如method1),但你直接调用了method1(file_path1),把返回的DataFrame传给了map,这完全偏离了多进程的执行逻辑。
  2. map的参数传递逻辑是:第二个参数是一个可迭代对象,每个元素会被依次传给第一个参数指定的函数,不存在args这个关键字参数。

另外,在Windows系统下,多进程代码必须放在if __name__ == '__main__':代码块中,否则会出现子进程无限创建的问题,这个细节一定要注意。


方案1:针对不同函数的并行执行(保留method1和method2)

如果确实需要保留两个独立的函数,可以用apply_async来异步提交每个任务,之后再获取返回值:

import re
import pandas as pd
from multiprocessing import Pool

def remove_special_char(data):
    data['Description'] = data['Description'].apply(lambda val: re.sub(r'^=', "'=", str(val)))
    return data

def method1(file_path):
    data = pd.read_excel(file_path)
    data = remove_special_char(data)
    return data

def method2(file_path):
    data = pd.read_excel(file_path)
    data = remove_special_char(data)
    return data

if __name__ == '__main__':
    file_path1 = '.\\file1.xlsx'
    file_path2 = '.\\file2.xlsx'

    # 创建进程池,两个任务用2个进程足够
    with Pool(2) as p:
        # 异步提交两个任务,指定函数和参数
        task1 = p.apply_async(method1, args=(file_path1,))
        task2 = p.apply_async(method2, args=(file_path2,))
        
        # 获取任务结果(会阻塞直到任务完成)
        result1 = task1.get()
        result2 = task2.get()

    # 现在可以正常使用处理后的DataFrame了
    print("处理后的file1数据:")
    print(result1.head())
    print("\n处理后的file2数据:")
    print(result2.head())

方案2:合并重复函数(更简洁推荐)

注意到你的method1和method2逻辑完全一致,只是传入的文件路径不同,完全可以合并成一个通用函数,用map批量处理多个文件路径,代码更简洁:

import re
import pandas as pd
from multiprocessing import Pool

def remove_special_char(data):
    data['Description'] = data['Description'].apply(lambda val: re.sub(r'^=', "'=", str(val)))
    return data

# 通用处理函数
def process_excel_file(file_path):
    data = pd.read_excel(file_path)
    data = remove_special_char(data)
    return data

if __name__ == '__main__':
    file_paths = ['.\\file1.xlsx', '.\\file2.xlsx']

    with Pool(2) as p:
        # map会自动把列表中的每个路径传给process_excel_file
        results = p.map(process_excel_file, file_paths)
    
    # 拆分结果
    result1, result2 = results

    # 使用结果
    print("处理后的file1数据:")
    print(result1.head())
    print("\n处理后的file2数据:")
    print(result2.head())

关键说明

  1. with Pool():使用上下文管理器可以自动关闭进程池,无需手动调用p.close()和p.join(),更安全省心。
  2. apply_async vs map:apply_async适合提交单个独立任务(支持不同函数),map适合批量执行相同函数的多个参数。
  3. Windows系统的__name__检查:这是必须的,因为Windows没有fork机制,会通过导入模块的方式创建子进程,不加这个检查会导致代码重复执行,引发错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 18:37:31