💻 黑马程序员 Python 高级语法进阶教程 - 第6节:进程间不共享全局变量
本节重点:理解 Python 多进程中全局变量不共享的本质机制。
📌 一、知识引入:为什么会以为变量是共享的?
在学习多线程时,我们常会发现多个线程可以访问同一个全局变量。这种共享带来很多方便(当然也有数据安全问题)。但到了多进程时,这一思维如果不纠正,就容易出错。
黑马程序员课程在讲到 multiprocessing
时,特别强调了这句话:
进程之间不共享全局变量。
这意味着,即使变量的名字一样、函数在同一个模块里定义,也不是“共享一份”。
🧠 二、原理解释:为什么进程不共享全局变量?
“创建子进程的过程其实就是把主进程的资源复制一份给子进程。”
也就是说,每个子进程启动时,Python 会把主进程的资源做拷贝,包括内存里的变量。这就是为什么两个子进程看起来有 my_list
,但操作的是两个不同的 my_list
。
正如课程中的比喻:
主进程和子进程就像是一对双胞胎,名字相同但身体不同。
🧪 三、实验验证:多进程下的全局变量
我们跟着课程写一个实验代码:
import multiprocessing
import time
# 定义全局变量
my_list = []
# 写数据进程
def write_data():
for i in range(3):
my_list.append(i)
print("add:", i)
time.sleep(0.2)
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 []
注意:读取进程中打印的 my_list
是空的!说明两个进程并没有共享这份全局数据。
📷 四、图示理解(来自课程讲义)
在课程中,黑马程序员使用了孙悟空的形象来说明这个问题:
-
主进程拥有一份全局变量
my_list
-
子进程每创建一次,都会“拷贝”一份新的
my_list
-
所以不同进程中的变量虽然名字一样,本质上是不同的内存地址、不同的对象
图示直观表示如下:
主进程 ---> 子进程(写) ---> my_list = [0,1,2]
---> 子进程(读) ---> my_list = []
📍 五、知识要点总结
-
多进程之间的变量是独立的,即便名字一样,也不共享内存。
-
Python 使用
fork()
或spawn()
启动子进程时,会将当前内存数据拷贝一份。 -
想要多个进程共享变量,需要使用
multiprocessing.Manager()
、Queue
、Pipe
等进程间通信机制(IPC)。
💡 六、思考延伸:如果想共享数据该怎么办?
我们可以使用 Manager().list()
来构造一份真正共享的变量,例如:
from multiprocessing import Process, Manager
def write_data(shared_list):
for i in range(3):
shared_list.append(i)
def read_data(shared_list):
print("read_data", shared_list)
if __name__ == '__main__':
with Manager() as manager:
my_list = manager.list()
write_process = Process(target=write_data, args=(my_list,))
read_process = Process(target=read_data, args=(my_list,))
write_process.start()
write_process.join()
read_process.start()
read_process.join()
输出:
read_data [0, 1, 2]
这才是共享了数据。
✍️ 七、个人总结
这节课让我意识到一个重要的底层机制:进程之间资源是隔离的,哪怕代码上写的是“全局变量”,运行时每个进程的内存是独立的。这是 Python 多进程的设计初衷,为的是更好地实现并行,提高安全性。
想让多个进程操作同一个数据,一定要借助 共享内存机制,或者通过 通信工具 实现。
如果你觉得这篇博客有帮助,欢迎点赞、收藏、转发,你的支持是我更新最大的动力 ❤️