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
相关产品推荐
相关产品推荐

