Python多进程传递Pandas DataFrame问题:子进程修改后数据未保留
问题原因与解决方案
问题根源
Python的multiprocessing模块创建子进程时,会完整复制主进程的内存空间(包括所有变量、对象)。你传入子进程的db其实是主进程DataFrame的一个副本,子进程里对它的修改只会作用在这个副本上,和主进程的原DataFrame没有任何关联。这就是为什么子进程能打印出添加行后的结果,但主进程的db还是空的。
解决方案
按照你最初的思路——每个进程用独立DataFrame,最后合并,正确的做法是让子进程返回自己的DataFrame,主进程收集所有子进程的结果后合并。以下是两种实现方式:
方式一:使用multiprocessing.Pool批量处理(适合多任务场景)
import pandas as pd import multiprocessing def process_task(_): # 每个子进程创建独立的DataFrame并处理 db = pd.DataFrame(columns=['name', 'power']) db.loc[len(db)] = ['Sample', 'Testing'] return db if __name__ == '__main__': # 创建进程池,指定进程数 with multiprocessing.Pool(processes=3) as pool: # 提交N个任务,获取所有子进程返回的DataFrame列表 results = pool.map(process_task, range(3)) # 合并所有子进程的DataFrame final_db = pd.concat(results, ignore_index=True) print(final_db)
方式二:使用Queue传递结果(适合单进程或自定义进程管理场景)
import pandas as pd import multiprocessing def add_row_to_db(result_queue): # 子进程创建自己的DataFrame db = pd.DataFrame(columns=['name', 'power']) db.loc[len(db)] = ['Sample', 'Testing'] # 将结果放入队列传递给主进程 result_queue.put(db) if __name__ == '__main__': result_queue = multiprocessing.Queue() process = multiprocessing.Process(target=add_row_to_db, args=(result_queue,)) process.start() process.join() # 从队列取出子进程的结果 child_result = result_queue.get() # 多进程场景下可循环get所有结果后concat final_db = child_result print(final_db)
关键总结
不要试图让子进程修改主进程的对象,而是让每个子进程独立维护自己的DataFrame,完成任务后将结果传递回主进程,最后在主进程中合并所有结果。这种方式既避免了锁机制的开销,又能保证数据的正确性。
内容的提问来源于stack exchange,提问作者magicianv7
相关产品推荐
相关产品推荐

