Python 多进程共享内存:multiprocessing.shared_memory 模块详解 ...

打印 上一主题 下一主题

主题 1869|帖子 1869|积分 5607

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Python 多进程共享内存:multiprocessing.shared_memory 模块详解

在 Python 的多进程编程中,进程间通信和数据共享是关键题目。multiprocessing.shared_memory 模块为我们提供了一种高效的方式来实现多进程之间的共享内存操作。该模块允许差别的进程直接访问同一块物理内存区域,避免了数据的复制,从而显著进步了数据传输和处理的效率。本文将深入剖析 multiprocessing.shared_memory 模块,详细介绍其核心概念、使用方法、常见操作及注意事项,帮助读者掌握多进程共享内存编程技巧。

  
一、模块概述

multiprocessing.shared_memory 模块是 Python 3.8 引入的标准库模块,它提供了 SharedMemory 类,用于创建和管理跨进程的共享内存块。通过共享内存,多个进程可以同时读写同一块内存区域,实现高效的数据共享。这在处理大规模数据时尤为有用,比如在机器学习中的数据并行处理、多进程数据挖掘等场景。
二、核心类:SharedMemory

(一)创建共享内存块

可以使用 SharedMemory 类的构造函数来创建一个新的共享内存块。构造函数的常用参数如下:


  • name:共享内存块的唯一标识符,可选参数。如果不指定,体系会自动天生一个唯一的名称。
  • create:布尔值,指示是否创建新的共享内存块。默以为 False,若为 True 则创建新的内存块。
  • size:整数,指定共享内存块的大小(以字节为单元),仅在 create 为 True 时需要指定。
  1. import multiprocessing.shared_memory as shm
  2. # 创建一个大小为 1024 字节的共享内存块
  3. shared_mem = shm.SharedMemory(create=True, size=1024)
  4. print(f"共享内存块名称: {shared_mem.name}")
复制代码
(二)访问和操作共享内存

SharedMemory 对象有一个 buf 属性,它是一个 memoryview 对象,用于访问共享内存块的内容。可以像操作平凡字节序列一样对其进行读写操作。
  1. import multiprocessing.shared_memory as shm
  2. # 创建共享内存块
  3. shared_mem = shm.SharedMemory(create=True, size=10)
  4. # 向共享内存中写入数据
  5. data = b'Hello!'
  6. shared_mem.buf[:len(data)] = data
  7. # 从共享内存中读取数据
  8. read_data = bytes(shared_mem.buf[:len(data)])
  9. print(f"读取的数据: {read_data}")
  10. # 关闭共享内存连接
  11. shared_mem.close()
  12. # 释放共享内存块
  13. shared_mem.unlink()
复制代码
(三)差别进程中访问共享内存

在差别的进程中,可以通过共享内存块的名称来访问已存在的共享内存。
  1. import multiprocessing
  2. import multiprocessing.shared_memory as shm
  3. def child_process(name):
  4.     # 连接到已存在的共享内存块
  5.     existing_shm = shm.SharedMemory(name=name)
  6.     data = bytes(existing_shm.buf[:6])
  7.     print(f"子进程读取的数据: {data}")
  8.     existing_shm.close()
  9. if __name__ == '__main__':
  10.     # 创建共享内存块
  11.     shared_mem = shm.SharedMemory(create=True, size=10)
  12.     data = b'Hello!'
  13.     shared_mem.buf[:len(data)] = data
  14.     # 创建子进程并传递共享内存块的名称
  15.     p = multiprocessing.Process(target=child_process, args=(shared_mem.name,))
  16.     p.start()
  17.     p.join()
  18.     # 关闭共享内存连接并释放内存块
  19.     shared_mem.close()
  20.     shared_mem.unlink()
复制代码
三、共享内存数组:ShareableList

ShareableList 是基于 SharedMemory 实现的一个类,用于在多个进程间共享类似列表的数据结构。它支持常见的列表操作,如索引访问、切片、赋值等。
(一)创建和使用 ShareableList

  1. import multiprocessing.shared_memory as shm
  2. from multiprocessing.managers import SharedMemoryManager
  3. # 创建共享内存管理器
  4. with SharedMemoryManager() as smm:
  5.     # 创建一个 ShareableList 对象
  6.     shareable_list = smm.ShareableList([1, 2, 3, 4, 5])
  7.     print(f"初始列表: {shareable_list}")
  8.     # 修改列表元素
  9.     shareable_list[2] = 10
  10.     print(f"修改后的列表: {shareable_list}")
复制代码
(二)在多进程中使用 ShareableList

  1. import multiprocessing
  2. import multiprocessing.shared_memory as shm
  3. from multiprocessing.managers import SharedMemoryManager
  4. def child_process(shl):
  5.     # 修改 ShareableList 中的元素
  6.     shl[0] = 100
  7.     print(f"子进程修改后的列表: {shl}")
  8. if __name__ == '__main__':
  9.     with SharedMemoryManager() as smm:
  10.         # 创建 ShareableList 对象
  11.         shareable_list = smm.ShareableList([1, 2, 3, 4, 5])
  12.         # 创建子进程并传递 ShareableList 对象
  13.         p = multiprocessing.Process(target=child_process, args=(shareable_list,))
  14.         p.start()
  15.         p.join()
  16.         print(f"主进程读取的列表: {shareable_list}")
复制代码
四、使用注意事项

(一)内存管理



  • 关闭连接:每个进程使用完共享内存后,应调用 close() 方法关闭对共享内存的连接,以释放相关资源。
  • 释放内存块:当所有进程都不再需要共享内存块时,应调用 unlink() 方法释放该内存块。只有调用 unlink() 后,体系才会真正接纳该内存。
(二)数据范例和大小



  • 共享内存中存储的数据本质上是字节序列,需要自行处理数据范例的转换。比方,将整数存储到共享内存中时,需要思量字节序和数据长度。
  • 在创建共享内存块时,要准确预估所需的内存大小,避免因内存不足导致数据丢失或程序堕落。
(三)并发访问

多个进程同时对共享内存进行读写操作时,可能会出现数据竞争题目。可以使用同步机制(如 multiprocessing.Lock)来保证数据的同等性。
  1. import multiprocessing
  2. import multiprocessing.shared_memory as shm
  3. from multiprocessing import Lock
  4. def increment(shm_obj, lock):
  5.     with lock:
  6.         # 假设共享内存中存储的是一个整数
  7.         value = int.from_bytes(shm_obj.buf[:4], byteorder='big')
  8.         value += 1
  9.         shm_obj.buf[:4] = value.to_bytes(4, byteorder='big')
  10. if __name__ == '__main__':
  11.     # 创建共享内存块
  12.     shared_mem = shm.SharedMemory(create=True, size=4)
  13.     initial_value = 0
  14.     shared_mem.buf[:4] = initial_value.to_bytes(4, byteorder='big')
  15.     # 创建锁对象
  16.     lock = Lock()
  17.     # 创建多个进程
  18.     processes = []
  19.     for _ in range(5):
  20.         p = multiprocessing.Process(target=increment, args=(shared_mem, lock))
  21.         processes.append(p)
  22.         p.start()
  23.     # 等待所有进程结束
  24.     for p in processes:
  25.         p.join()
  26.     # 读取最终结果
  27.     final_value = int.from_bytes(shared_mem.buf[:4], byteorder='big')
  28.     print(f"最终值: {final_value}")
  29.     # 关闭连接并释放内存块
  30.     shared_mem.close()
  31.     shared_mem.unlink()
复制代码
总结

multiprocessing.shared_memory 模块为 Python 多进程编程提供了高效的共享内存办理方案。通过 SharedMemory 类和 ShareableList 类,我们可以方便地在多个进程间共享数据,避免了数据的复制,进步了程序的性能。但在使用过程中,需要注意内存管理、数据范例和并发访问等题目,以确保程序的精确性和稳固性。
TAG: Python、multiprocessing.shared_memory、多进程编程、共享内存、ShareableList

相关学习资源


  • Python 官方文档(https://docs.python.org/zh-cn/3.12/library/multiprocessing.shared_memory.html):提供了 multiprocessing.shared_memory 模块的详细文档,包罗类和方法的定义、使用示例及注意事项,是学习该模块的权威资料。
  • Tekin的Python编程秘籍库: Python 实用知识与技巧分享,涵盖根本、爬虫、数据分析等干货 本 Python 专栏聚焦实用知识,深入剖析根本语法、数据结构。分享爬虫、数据分析等热门范畴实战技巧,辅以代码示例。无论新手入门还是进阶提升,都能在此劳绩满满干货,快速掌握 Python 编程精髓。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

宝塔山

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表