### Python多进程主进程与子进程间的全局变量共享与非共享 #### 一、引言 在Python中,多进程编程是一种常见的并行处理技术,它允许程序将任务分配到多个独立的进程上运行,从而充分利用多核处理器的能力。然而,在多进程编程中,全局变量的管理是一个重要的考虑因素。本篇文章将详细介绍Python多进程环境中,主进程与子进程之间全局变量的共享与非共享机制,并提供具体的代码示例。 #### 二、Python多进程全局变量的默认行为 在Python中,默认情况下,主进程与子进程之间不会共享全局变量。这意味着在子进程中对全局变量所做的任何修改都不会影响到主进程中的全局变量。这是由于每个进程都有自己的独立内存空间,因此每个进程拥有自己独立的全局变量副本。 #### 三、全局变量非共享示例 下面通过一个简单的例子来演示全局变量在多进程环境下的非共享特性: ```python import multiprocessing import time import os datalist = ['+++'] # 全局变量 def add_data(): global datalist datalist.append(1) datalist.append(2) datalist.append(3) print("子进程", os.getpid(), datalist) if __name__ == "__main__": p = multiprocessing.Process(target=add_data, args=()) p.start() p.join() datalist.append("a") datalist.append("b") datalist.append("c") print("主进程", os.getpid(), datalist) ``` 在上述示例中,`datalist` 是一个全局列表。子进程会尝试向其中添加整数1、2和3,而主进程则试图添加字符串'a'、'b'和'c'。运行结果表明,尽管子进程已经修改了`datalist`,但这些修改并没有反映在主进程中,这是因为子进程拥有的是`datalist`的一个独立副本。 #### 四、全局变量的共享方法 为了使主进程与子进程之间能够共享全局变量,Python提供了几种方法,包括使用`multiprocessing`模块中的`Value`、`Array`以及`Manager`类等。 ##### 4.1 使用 `multiprocessing.Value` 对于基本类型如浮点数,可以使用`multiprocessing.Value`来实现共享。 ```python import multiprocessing def func(num): num.value = 10.78 # 子进程改变数值的值,主进程跟着改变 if __name__ == "__main__": num = multiprocessing.Value("d", 10.0) # d表示数值, 主进程与子进程共享这个value print(num.value) p = multiprocessing.Process(target=func, args=(num,)) p.start() p.join() print(num.value) ``` ##### 4.2 使用 `multiprocessing.Array` 对于数组类型的共享,则可以使用`multiprocessing.Array`。 ```python import multiprocessing def func(num): num[2] = 9999 # 子进程改变数组,主进程跟着改变 if __name__ == "__main__": num = multiprocessing.Array("i", [1, 2, 3, 4, 5]) # 主进程与子进程共享这个数组 print(num[:]) p = multiprocessing.Process(target=func, args=(num,)) p.start() p.join() print(num[:]) ``` ##### 4.3 使用 `multiprocessing.Manager` 对于更复杂的数据结构如字典或列表,则可以使用`multiprocessing.Manager`提供的接口来创建共享对象。 ```python import multiprocessing def func(mydict, mylist): mydict["index1"] = "aaaaaa" # 子进程改变dict, 主进程跟着改变 mydict["index2"] = "bbbbbb" mylist.append(11) # 子进程改变List, 主进程跟着改变 mylist.append(22) mylist.append(33) if __name__ == "__main__": with multiprocessing.Manager() as MG: # 重命名 mydict = multiprocessing.Manager().dict() # 主进程与子进程共享这个字典 mylist = multiprocessing.Manager().list(range(5)) # 主进程与子进程共享这个List p = multiprocessing.Process(target=func, args=(mydict, mylist)) p.start() p.join() print(mylist) print(mydict) ``` #### 五、总结 在Python多进程编程中,全局变量默认是非共享的,这意味着子进程不会改变主进程中的全局变量。为了实现进程间的变量共享,可以通过使用`multiprocessing.Value`、`multiprocessing.Array`和`multiprocessing.Manager`等工具来创建共享数据结构。这些方法使得多进程间的变量共享变得简单且高效。了解这些基础知识对于开发高效的多进程应用至关重要。

























- 粉丝: 11
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 财务信息化:促进中小企业发展的方法探究.docx
- 智能家居—可能性研究分析评测报告.doc
- 互联网+一站式校园创业服务探索.docx
- 项目管理中的人力资源管理和沟通管理.docx
- 云计算网络环境下的信息安全问题研究.docx
- 大学设计箱体注塑模CADCAM方案一.doc
- 大数据下的医院财务信息共享研究.docx
- C语言程序设计算法资料.ppt
- PLC控制机械手95153.doc
- 学生成绩管理系统数据结构程序设计实验报告2.doc
- 网络工程第一章ppt.ppt
- 学校、幼儿园网络视频监控方案-教育文博.docx
- 大模型提示词优化器,让大模型根据测试结果进行反思生成优化建议,并结合用户要求进行提示词优化
- 单片机的按摩机的控制研究与设计开发.doc
- 伪均匀随机数的计算机检验.docx
- 大模型提示词优化器:依测试反思提建议并按用户要求优化


