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)
这里有两个致命问题:
map的第一个参数必须是函数对象(比如method1),但你直接调用了method1(file_path1),把返回的DataFrame传给了map,这完全偏离了多进程的执行逻辑。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())
关键说明
with Pool():使用上下文管理器可以自动关闭进程池,无需手动调用p.close()和p.join(),更安全省心。apply_asyncvsmap:apply_async适合提交单个独立任务(支持不同函数),map适合批量执行相同函数的多个参数。- Windows系统的
__name__检查:这是必须的,因为Windows没有fork机制,会通过导入模块的方式创建子进程,不加这个检查会导致代码重复执行,引发错误。
内容的提问来源于stack exchange,提问作者Aditya sharma
相关产品推荐
相关产品推荐

