Python多进程全局变量共享机制详解与实现

山间有风
山间有风
发布时间:2026-10-13 | 5人浏览过
原创

本文详解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多进程中主进程与子进程间全局变量共享与不共享的实例分享完毕,希望能为读者提供参考,并欢迎大家继续支持本站。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表