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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 21:36:26