黑马程序员Python高级语法进阶教程-6_进程间不共享全局变量

💻 黑马程序员 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()QueuePipe进程间通信机制(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 多进程的设计初衷,为的是更好地实现并行,提高安全性。

想让多个进程操作同一个数据,一定要借助 共享内存机制,或者通过 通信工具 实现。


如果你觉得这篇博客有帮助,欢迎点赞、收藏、转发,你的支持是我更新最大的动力 ❤️

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

夏驰和徐策

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

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

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

打赏作者

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

抵扣说明:

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

余额充值