Python子进程中全局变量不共享,因每个进程有独立内存空间,fork时仅复制初始值,后续修改互不影响;multiprocessing模块的Manager或Value等提供IPC机制而非真正共享全局变量。

Python 子进程中全局变量不共享。这是由操作系统进程模型决定的——每个进程拥有独立的内存空间,子进程是父进程的副本,启动时会复制父进程的整个内存状态(包括全局变量),但之后两者完全隔离。
fork 机制导致变量“复制而非共享”
在 Unix/Linux 系统中,os.fork() 或 multiprocessing.Process 启动子进程时,底层调用 fork() 系统调用。它创建一个与父进程内存布局一致的新进程,但物理内存页在写入时才实际复制(写时复制,Copy-on-Write)。这意味着:
- 子进程启动时,全局变量值和父进程相同,但只是初始快照
- 子进程中修改全局变量,不会影响父进程;反之亦然
- 即使变量是可变对象(如列表、字典),修改其内容也只作用于当前进程的副本
multiprocessing 模块中的常见误解
很多人误以为 multiprocessing.Manager() 或 multiprocessing.Value/Array 是“共享全局变量”,其实它们不是让全局变量本身共享,而是提供跨进程通信(IPC)机制:
-
Manager().dict()返回的是代理对象,读写会通过进程间通信同步到管理进程 -
Value('i', 0)底层使用共享内存(如 mmap),需显式传递给子进程,不能靠“全局访问”生效 - 直接在子进程中引用模块级全局变量,访问的是该进程内独立的一份副本
验证示例
以下代码清晰展示行为:
立即学习“Python免费学习笔记(深入)”;
import multiprocessing import timecounter = 100 # 全局变量
def worker(): global counter print(f"[子进程] 初始 counter = {counter}") # 输出 100 counter += 1 print(f"[子进程] 修改后 counter = {counter}") # 输出 101
if name == 'main': p = multiprocessing.Process(target=worker) p.start() p.join() print(f"[主进程] 子进程结束后 counter = {counter}") # 仍输出 100
输出结果证实:子进程对 counter 的修改未反映到主进程。










