黑马程序员Python高级语法进阶教程
第6讲:进程间不共享全局变量
在多进程编程中,一个非常重要的概念就是 “进程间数据不共享”。本节课详细讲解了这个现象,并通过代码实验证明了 Python 中多进程程序之间无法共享全局变量。本篇博客将从以下几个方面展开:
一、进程间不共享全局变量的本质
当我们创建一个新进程时,实际上是在操作系统层面上复制了当前进程的资源和运行环境,创建了一个独立的进程副本。这个副本拥有自己的内存空间,因此即使两个进程中有名字相同的变量,它们也是互不影响、互不通信的。
就像视频中的比喻:主进程就像孙悟空,而子进程是从主进程“复制”出来的另一个悟空。虽然长得一样,名字也一样,但实际上是两个不同的个体。
二、实验代码演示
课程提供了以下示例代码:
import multiprocessing
my_list = []
# 写入数据
def write_data():
for i in range(3):
my_list.append(i)
print("add:", i)
print("write_data", my_list)
# 读取数据
def read_data():
print("read_data", my_list)
if __name__ == '__main__':
write_process = multiprocessing.Process(target=write_data)
read_process = multiprocessing.Process(target=read_data)
write_process.start()
write_process.join() # 确保写完再读
read_process.start()
运行结果(关键点):
add: 0
add: 1
add: 2
write_data [0, 1, 2]
read_data []
解释:
-
write_data()
中把数据写入了my_list
,但是这个my_list
是写入进程自己那份内存空间中的变量。 -
read_data()
在另一个进程中执行,此时它读取的是自己的my_list
,初始为空。
三、图解进程变量独立性
视频中有非常清晰的图示:
主进程:
my_list = []
创建子进程时,写入数据进程:
my_list = [] # 拷贝副本
创建子进程时,读取数据进程:
my_list = [] # 拷贝副本
尽管变量名一样,但每个进程中都拥有属于自己的变量副本,数据并没有真正共享。
四、关键知识点总结
-
进程之间不共享全局变量,每个进程拥有独立内存空间。
-
变量名可以相同,但本质上是不同的对象。
-
想要多个进程共享数据,必须借助进程间通信机制(如
Queue
、Pipe
、Manager().list()
等)。 -
write_process.join()
只是确保主进程等待写入结束,并不会将写入的数据传递给下一个进程。
五、个人理解与拓展
这个机制其实是操作系统出于进程隔离和安全性考虑的一种设计。换句话说,你不能指望通过普通变量来让两个独立的进程互相通信,那是不现实的。
如果你真的需要多个进程共享数据,那就要用专门的方式,比如:
from multiprocessing import Manager
manager = Manager()
shared_list = manager.list()
# 这个 shared_list 就是进程间可共享的变量了
六、面试问答小贴士
面试官问:“Python 中多进程能否共享全局变量?”
答:**不能。**每个进程有独立内存空间,除非使用 multiprocessing.Manager
等方式创建的特殊共享变量,否则默认的全局变量是无法共享的。
七、结语
“进程间不共享全局变量” 是理解 Python 多进程的核心之一。如果你掌握了这个原理,就可以避免掉入“变量为什么没传过去”的坑,也能更好地设计你的多进程程序。
下一节我们将继续学习如何让进程之间真正共享数据,敬请期待!