多进程环境下如何动态修改列表变量实现倍数递增输出
多进程下共享列表的问题解决
你写了一段Python代码,想用多进程动态更新列表并每秒打印,期望每次打印的列表最后一个元素是前一次的2倍,但实际输出始终是初始列表,加了global lis也没用。
原代码:
import time, multiprocessing lis = [1, 2, 4] def printer(): while True: print(lis) time.sleep(1) def updater(): while True: time.sleep(1) lis.append(lis[-1]*2) if __name__ == '__main__': process1 = multiprocessing.Process(target=updater) process2 = multiprocessing.Process(target=printer) process1.start() process2.start() process1.join() process2.join()
问题根源
Python的多进程机制是每个子进程都会复制父进程的内存空间,也就是说lis在两个子进程里各有一份独立的副本:
updater进程修改的是自己那份lis,和printer进程里的lis完全没关系printer进程一直读的是自己初始化时的那份初始列表,自然看不到更新
加global lis没用,因为global只是声明用全局变量,但这个全局变量在每个进程里都是独立的副本。
解决方法:用multiprocessing.Manager创建共享列表
通过multiprocessing.Manager可以创建跨进程共享的对象,它会在后台启动一个服务进程,所有子进程通过代理访问这个共享对象,这样就能实现数据同步。
修改后的代码:
import time, multiprocessing def printer(lis): while True: print(lis) time.sleep(1) def updater(lis): while True: time.sleep(1) lis.append(lis[-1]*2) if __name__ == '__main__': # 创建可共享的列表 with multiprocessing.Manager() as manager: lis = manager.list([1, 2, 4]) process1 = multiprocessing.Process(target=updater, args=(lis,)) process2 = multiprocessing.Process(target=printer, args=(lis,)) process1.start() process2.start() process1.join() process2.join()
关键改动说明
- 用
manager.list()替代普通列表,创建跨进程共享的列表对象 - 将共享列表作为参数传给两个进程,避免依赖全局变量(全局变量在多进程里本来就不共享)
- 使用
with语句管理Manager,确保资源自动释放
运行这段代码后,输出就会符合你的期望:
[1, 2, 4] [1, 2, 4, 8] [1, 2, 4, 8, 16] [1, 2, 4, 8, 16, 32] ...
内容的提问来源于stack exchange,提问作者John Persuro
相关产品推荐
相关产品推荐

