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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 01:35:32