Python循环迭代中多进程并行执行的实现问题
解决Python多进程中无法填充共享列表的问题
在CPython的multiprocessing机制中,每个子进程会获得父进程内存空间的独立副本。你直接把主进程的list_1、list_2传给子进程,子进程里的append操作只是修改了自己副本里的列表,完全不会影响主进程中的原列表,这就是为什么最终打印的列表是空的。
下面给出两种可行的解决方案:
方案1:使用Manager创建共享列表
multiprocessing.Manager可以创建跨进程共享的对象,包括列表。子进程对共享列表的修改会同步到主进程。
完整示例代码:
import random import multiprocessing as mp def func_1(arr, outlist): # 示例处理逻辑:计算数组元素和 result = sum(arr) outlist.append(result) def func_2(arr, outlist): # 示例处理逻辑:计算数组元素最大值(空数组返回0) result = max(arr) if arr else 0 outlist.append(result) if __name__ == "__main__": n = 5 # 定义迭代次数 with mp.Manager() as manager: list_1 = manager.list() list_2 = manager.list() for i in range(n): arr_1 = [random.randint(0,100) for _ in range(i)] arr_2 = list(arr_1) proc_one = mp.Process(target=func_1, args=(arr_1, list_1)) proc_two = mp.Process(target=func_2, args=(arr_2, list_2)) proc_one.start() proc_two.start() proc_one.join() proc_two.join() # 转换为普通列表便于打印(可选) print(list(list_1)) print(list(list_2))
注意事项:
- 必须在
if __name__ == "__main__":块中运行多进程代码,这是Windows系统的强制要求,也能避免Unix系统的重复启动问题。 - Manager创建的共享对象有一定性能开销,适合小规模数据场景。
方案2:使用Queue传递结果
Queue是进程安全的通信机制,子进程将计算结果放入队列,主进程在每次迭代后从队列取出结果并添加到本地列表。
完整示例代码:
import random import multiprocessing as mp def func_1(arr, queue): result = sum(arr) queue.put(result) def func_2(arr, queue): result = max(arr) if arr else 0 queue.put(result) if __name__ == "__main__": n = 5 list_1 = [] list_2 = [] for i in range(n): arr_1 = [random.randint(0,100) for _ in range(i)] arr_2 = list(arr_1) q1 = mp.Queue() q2 = mp.Queue() proc_one = mp.Process(target=func_1, args=(arr_1, q1)) proc_two = mp.Process(target=func_2, args=(arr_2, q2)) proc_one.start() proc_two.start() # 从队列取出结果 list_1.append(q1.get()) list_2.append(q2.get()) proc_one.join() proc_two.join() print(list_1) print(list_2)
注意事项:
- Queue的
get()方法会阻塞直到有数据可用,所以要在join()之前或之后调用都可以,但确保子进程已经把数据放入队列。 - 如果是批量处理,也可以用单个队列区分不同函数的结果(比如放入元组标记来源)。
原代码的其他小问题修正
- 原代码中
proc_one = mp.Process(...)和proc_two的定义末尾缺少闭合括号。 n变量未定义,需要提前赋值。
内容的提问来源于stack exchange,提问作者amkhrjee
相关产品推荐
相关产品推荐

