如何实现Python多进程间列表修改的共享同步?
Python多进程共享列表修改的解决方案
问题根源
Python多进程中,每个子进程会复制父进程的内存空间,你定义的listx在one和two进程里是完全独立的副本。two修改的是自己进程内的副本,one读取的是自己进程内的副本,自然感知不到对方的修改。
核心解决方法:使用multiprocessing.Manager
multiprocessing.Manager会启动一个独立的管理进程,负责维护共享对象,其他子进程通过代理访问该对象,实现真正的跨进程数据共享。
修改后的可运行代码:
import multiprocessing import time # 原代码遗漏time模块,需补充 def one(listx): time.sleep(5) if 'ok' not in listx: print('not in') else: print('in') def two(listx): listx.append('ok') if __name__ == '__main__': with multiprocessing.Manager() as manager: # 创建跨进程共享的列表对象 listx = manager.list() # 将共享列表作为参数传递给子进程 p1 = multiprocessing.Process(target=one, args=(listx,)) p2 = multiprocessing.Process(target=two, args=(listx,)) p1.start() p2.start() # 等待进程执行完毕,确保输出能正常显示 p1.join() p2.join()
运行后会输出in,说明进程间的列表修改已被正确感知。
其他可选方案
multiprocessing.Array:适合固定长度的基本类型数组(如整数、字符),但用法比Manager.list更繁琐,适合对性能要求较高的场景。multiprocessing.Queue:如果只是需要进程间传递数据而非直接共享列表,队列是更安全的选择,天然支持生产者-消费者模式,无需手动处理同步问题。
注意:不要依赖全局变量实现进程间共享,子进程的全局变量是父进程的副本,无法实现数据同步。
内容的提问来源于stack exchange,提问作者Drake Ramoray
相关产品推荐
相关产品推荐

