黑马程序员Python高级语法进阶教程-8_线程的介绍

黑马程序员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 = []  # 拷贝副本

尽管变量名一样,但每个进程中都拥有属于自己的变量副本,数据并没有真正共享


四、关键知识点总结

  1. 进程之间不共享全局变量,每个进程拥有独立内存空间。

  2. 变量名可以相同,但本质上是不同的对象。

  3. 想要多个进程共享数据,必须借助进程间通信机制(如 QueuePipeManager().list() 等)。

  4. write_process.join() 只是确保主进程等待写入结束,并不会将写入的数据传递给下一个进程。


五、个人理解与拓展

这个机制其实是操作系统出于进程隔离和安全性考虑的一种设计。换句话说,你不能指望通过普通变量来让两个独立的进程互相通信,那是不现实的。

如果你真的需要多个进程共享数据,那就要用专门的方式,比如:

from multiprocessing import Manager

manager = Manager()
shared_list = manager.list()

# 这个 shared_list 就是进程间可共享的变量了

六、面试问答小贴士

面试官问:“Python 中多进程能否共享全局变量?”

答:**不能。**每个进程有独立内存空间,除非使用 multiprocessing.Manager 等方式创建的特殊共享变量,否则默认的全局变量是无法共享的。


七、结语

进程间不共享全局变量” 是理解 Python 多进程的核心之一。如果你掌握了这个原理,就可以避免掉入“变量为什么没传过去”的坑,也能更好地设计你的多进程程序。

下一节我们将继续学习如何让进程之间真正共享数据,敬请期待!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏驰和徐策

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值