Python multiprocessing多进程场景下共享列表未被修改问题求解
错误原因
- 共享列表对象被意外覆盖
你调用manager.list()生成的是支持跨进程同步的代理对象,但后续执行shared_list = input_list[:]时,直接把shared_list变量指向了普通的Python列表对象。普通列表存在于各进程独立的内存空间中,子进程对普通列表的修改只会作用于当前进程的副本,不会同步回主进程。 - 不推荐用
global传递共享对象
多进程启动时会拷贝父进程的内存空间,global修饰的变量在子进程中是独立副本,只有manager创建的代理对象本身具备跨进程同步能力,最优实践是将共享对象直接作为参数传递给子进程任务。
修正后的代码
from multiprocessing import Process, Manager input_list = ["A", "B", "C", "D", "E", "F"] manager = Manager() # 初始化共享列表时直接传入input_list,保留代理对象引用 shared_list = manager.list(input_list) def do_stuff(element, i, shared_list): shared_list[i] = element[i] * 2 print(shared_list[i]) processes = [] for i in range(len(input_list)): # 把共享列表作为参数传入子进程 p = Process(target=do_stuff, args=(input_list, i, shared_list)) p.start() processes.append(p) for p in processes: p.join() # 转成普通列表打印更直观 print(list(shared_list))
执行效果
运行修正后代码最终输出为:['AA', 'BB', 'CC', 'DD', 'EE', 'FF'],符合预期修改结果。
内容的提问来源于stack exchange,提问作者Monica
相关产品推荐
相关产品推荐

