当前位置:首页 > Python > 正文

Python共享内存详解(小白也能看懂的multiprocessing共享内存与进程间通信教程)

在多进程编程中,Python共享内存是一种高效的进程间通信方式。它允许多个进程直接访问同一块物理内存区域,避免了数据复制带来的性能开销。本教程将从零开始,手把手教你如何使用 Python 的 multiprocessing 模块实现共享内存,即使你是编程新手也能轻松上手!

Python共享内存详解(小白也能看懂的multiprocessing共享内存与进程间通信教程) Python共享内存  multiprocessing共享内存 Python进程间通信 共享内存教程 第1张

什么是共享内存?

共享内存是指多个进程可以同时读写同一块内存区域。相比队列(Queue)或管道(Pipe),它速度更快、效率更高,特别适合需要频繁交换大量数据的场景。

在 Python 中,multiprocessing 模块提供了两种主要的共享内存方式:

  • multiprocessing.Valuemultiprocessing.Array:适用于简单数据类型(如整数、浮点数、字符数组)
  • multiprocessing.shared_memory(Python 3.8+):更灵活,支持任意可序列化对象

方法一:使用 Value 和 Array 实现共享内存

这是最基础的方式,适合共享单个值或一维数组。

示例1:共享一个整数值

import multiprocessingimport timedef worker(num):    for i in range(5):        num.value += 1        print(f"子进程 {multiprocessing.current_process().name}: num = {num.value}")        time.sleep(0.1)if __name__ == "__main__":    # 创建一个共享的整数,初始值为0    shared_num = multiprocessing.Value('i', 0)  # 'i' 表示整型    # 启动两个子进程    p1 = multiprocessing.Process(target=worker, args=(shared_num,))    p2 = multiprocessing.Process(target=worker, args=(shared_num,))    p1.start()    p2.start()    p1.join()    p2.join()    print(f"主进程最终结果: num = {shared_num.value}")

注意:'i' 是类型代码,表示有符号整数。其他常用类型包括 'd'(双精度浮点)、'c'(字符)等。

示例2:共享一个整数数组

import multiprocessingdef modify_array(arr):    for i in range(len(arr)):        arr[i] = arr[i] * 2if __name__ == "__main__":    # 创建长度为5的共享整数数组,初始值为[1,2,3,4,5]    shared_arr = multiprocessing.Array('i', [1, 2, 3, 4, 5])    print("修改前:", list(shared_arr))    p = multiprocessing.Process(target=modify_array, args=(shared_arr,))    p.start()    p.join()    print("修改后:", list(shared_arr))

方法二:使用 shared_memory(Python 3.8+)

从 Python 3.8 开始,官方引入了 multiprocessing.shared_memory 模块,它允许你创建命名的共享内存块,可以在不同进程中通过名称访问。

示例3:共享一个 NumPy 数组(需安装 numpy)

import multiprocessingimport numpy as npfrom multiprocessing import shared_memorydef create_and_write():    # 创建原始数据    original_data = np.array([1, 2, 3, 4, 5], dtype=np.int32)        # 创建共享内存    shm = shared_memory.SharedMemory(create=True, size=original_data.nbytes)        # 将数据写入共享内存    shared_array = np.ndarray(original_data.shape, dtype=original_data.dtype, buffer=shm.buf)    shared_array[:] = original_data[:]        print(f"写入共享内存,名称: {shm.name}")    return shm.name, original_data.shape, original_data.dtypedef read_from_shared(shm_name, shape, dtype):    # 连接到已存在的共享内存    existing_shm = shared_memory.SharedMemory(name=shm_name)        # 从共享内存读取数据    shared_array = np.ndarray(shape, dtype=dtype, buffer=existing_shm.buf)    print(f"读取到的数据: {shared_array}")        # 关闭连接(不释放内存)    existing_shm.close()if __name__ == "__main__":    shm_name, shape, dtype = create_and_write()        # 在另一个进程中读取    p = multiprocessing.Process(target=read_from_shared, args=(shm_name, shape, dtype))    p.start()    p.join()        # 主进程清理共享内存    shm = shared_memory.SharedMemory(name=shm_name)    shm.close()    shm.unlink()  # 释放共享内存

⚠️ 注意:使用 shared_memory 时,必须手动调用 unlink() 来释放系统资源,否则可能导致内存泄漏。

常见问题与注意事项

  • 线程安全:共享内存本身不是线程安全的!多个进程同时写入可能导致数据错乱。建议配合 multiprocessing.Lock 使用。
  • 数据类型限制:Value/Array 只支持 C 语言基本类型;shared_memory 虽灵活但需自行处理序列化。
  • 平台兼容性:shared_memory 在 Windows 和 Linux 上行为略有不同,测试时需注意。
  • 资源清理:务必在程序结束前关闭并释放共享内存,避免系统资源浪费。

总结

通过本教程,你已经掌握了 Python 中实现共享内存的两种主流方法。无论是简单的计数器还是复杂的 NumPy 数组,你都可以根据需求选择合适的方案。记住,Python进程间通信的方式很多,而共享内存是其中性能最优的选择之一。

现在,你可以尝试自己编写一个多进程图像处理程序,利用共享内存高效传递图像数据!

关键词:Python共享内存, multiprocessing共享内存, Python进程间通信, 共享内存教程