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

Python多进程疑似失效,求分析解决(附测试代码)

分析你的Python多进程问题及解决方案

嘿,我看了你的代码,马上发现几个核心问题导致多进程没达到预期效果,咱们一步步拆解:

核心问题1:进程间内存隔离,普通list无法共享修改

Python多进程的每个子进程都有独立的内存空间,你用普通list当result_i传给子进程,子进程里修改的只是这个list的副本,主进程根本看不到任何变化——相当于白忙活一场。

核心问题2:单进程测试的逻辑误区

你单进程里传的result_i是主进程的list,但子进程修改的是自己的副本,主进程的result_i完全没被改动,这个测试的时间结果其实没有参考意义。

解决方案:用进程间共享数据结构

要让子进程的修改能被主进程看到,得用multiprocessing提供的共享数据结构,比如Manager.list(用法和普通list接近)或者Array。下面是修正后的完整代码:

修正后的可运行代码

import multiprocessing as mp
import time

def cube(list_segment, shared_result):
    # 遍历分段的索引和值,修改共享列表对应位置
    for idx, num in enumerate(list_segment):
        # 计算原列表中的真实索引(因为list_segment是原列表的切片)
        original_idx = list_segment.start + idx
        shared_result[original_idx] = num ** 3

def test():
    # 使用Manager创建可共享的列表,上下文管理器自动释放资源
    with mp.Manager() as manager:
        total_size = 10000000
        # 初始化共享列表,和原数据长度一致
        shared_result = manager.list(range(total_size))
        
        # 单进程测试
        print("单进程执行中...")
        single_process = mp.Process(target=cube, args=(range(total_size), shared_result))
        start_time = time.time()
        single_process.start()
        single_process.join()
        print(f"单进程耗时: {time.time() - start_time:.2f}秒")
        
        # 重置共享列表(避免之前的修改影响多进程测试)
        shared_result[:] = range(total_size)
        
        # 多进程测试(拆分成4个进程)
        print("\n多进程执行中...")
        processes = []
        segment_size = total_size // 4
        for i in range(4):
            # 处理最后一段的边界,避免遗漏数据
            start = i * segment_size
            end = start + segment_size if i != 3 else total_size
            segment = range(start, end)
            p = mp.Process(target=cube, args=(segment, shared_result))
            processes.append(p)
        
        start_time = time.time()
        # 启动所有进程
        for p in processes:
            p.start()
        # 等待所有进程结束
        for p in processes:
            p.join()
        print(f"多进程耗时: {time.time() - start_time:.2f}秒")

# Windows系统下多进程必须加这个判断,Unix系统建议加,更规范
if __name__ == "__main__":
    test()

额外提醒

  • 如果多进程跑起来没比单进程快多少,可能是因为num**3是轻量计算,进程间通信的开销抵消了并行优势。可以换成更耗时的计算(比如复杂的矩阵运算、加密操作),就能看到多进程的效果了。
  • Windows系统的进程启动开销比Unix大,小任务下多进程甚至可能更慢,这是正常现象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:55:22