Python多进程全局变量共享机制详解与实现
本文详解Python多进程中主进程与子进程对全局变量的共享机制。默认情况下,子进程无法修改主进程的全局变量。文章通过Value、Array及Manager().dict/list等类实现了数值、数组及字典列表的跨进程共享,并介绍了Queue和Pipe用于进程间数据传递的方法,附带完整代码示例。
Python多进程全局变量共享机制概述
在Python的多进程编程模型中,默认情况下全局变量无法在进程间共享。
主进程与子进程以并发方式执行,两者之间默认不共享全局变量,这意味着子进程内的操作无法直接修改主进程中定义的全局变量值。
若需在多进程间共享全局变量,必须使用特定的同步对象:对于数值类型可使用multiprocessing.Value("d", 10.0),数组类型使用multiprocessing.Array("i", [1, 2, 3, 4, 5]),而字典和列表则分别通过multiprocessing.Manager().dict()和multiprocessing.Manager().list(range(5))来实现。
进程间传递数据(即进程通信)可通过进程队列multiprocessing.Queue()实现单向通信,或使用管道multiprocessing.Pipe()实现双向通信。

import multiprocessing
import time
import os
datalist=['+++'] #全局变量,主进程与子进程是并发执行的,他们不能共享全局变量(子进程不能改变主进程中全局变量的值)
def adddata():
global datalist
datalist.append(1)
datalist.append(2)
datalist.append(3)
print("子进程",os.getpid(),datalist)
if __name__=="__main__":
p=multiprocessing.Process(target=adddata,args=())
p.start()
p.join()
datalist.append("a")
datalist.append("b")
datalist.append("c")
print("主进程",os.getpid(),datalist)
进程间共享数据的具体实现
以下是Python中进程间共享数据(即全局变量)的具体实现方式。
进程间共享数值型数据的实现方法如下。
import multiprocessing
def func(num):
num.value=10.78 #子进程改变数值的值,主进程跟着改变
if __name__=="__main__":
num=multiprocessing.Value("d",10.0) # d表示数值,主进程与子进程共享这个value。(主进程与子进程都是用的同一个value)
print(num.value)
p=multiprocessing.Process(target=func,args=(num,))
p.start()
p.join()
print(num.value)
进程间共享数组型数据的实现方法如下。
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[:])
进程间共享字典(dict)和列表(list)数据的实现方法如下。
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)
多线程与多进程变量声明的区别
需要注意的是,多线程环境中通常使用global关键字来声明全局变量,这与多进程的共享机制有所不同。
以上关于Python多进程中主进程与子进程间全局变量共享与不共享的实例分享完毕,希望能为读者提供参考,并欢迎大家继续支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









