3.8 新版功能.
该模块提供了一个 SharedMemory 类,用于分配和管理多核或对称多处理器(SMP)机器上进程间的共享内存。为了协助管理不同进程间的共享内存生命周期,multiprocessing.managers 模块也提供了一个 BaseManager 的子类: SharedMemoryManager。
本模块中,共享内存是指 "System V 类型" 的共享内存块(虽然实现方式可能不完全一致)而不是 “分布式共享内存”。这种类型的的共享内存允许不同进程读写一片公共(或者共享)的易失性存储区域。一般来说,进程被限制只能访问属于自己进程空间的内存,但是共享内存允许跨进程共享数据,从而避免通过进程间发送消息的形式传递数据。与通过磁盘、套接字或者其他要求序列化、反序列化和复制数据的共享形式相比,直接通过内存共享数据拥有更出色的性能。
classmultiprocessing.shared_memory.SharedMemory(name=None, create=False, size=0)¶
创建一个新的共享内存块或者连接到一片已经存在的共享内存块。每个共享内存块都被指定了一个全局唯一的名称。通过这种方式,进程可以使用一个特定的名字创建共享内存区块,然后其他进程使用同样的名字连接到这个共享内存块。
作为一种跨进程共享数据的方式,共享内存块的寿命可能超过创建它的原始进程。一个共享内存块可能同时被多个进程使用,当一个进程不再需要访问这个共享内存块的时候,应该调用 close() 方法。当一个共享内存块不被任何进程使用的时候,应该调用 unlink() 方法以保证必要的清理。
name 是共享内存的唯一名称,字符串类型。如果创建一个新共享内存块的时候,名称指定为 None (默认值),将会随机产生一个新名称。
create 指定创建一个新的共享内存块 (True) 还是连接到已存在的共享内存块 (False) 。
如果是新创建共享内存块则 size 用于指定块的大小为多少字节。由于某些平台是以内存页大小为最小单位来分配内存的,最终得到的内存块大小可能大于或等于要求的大小。如果是连接到已经存在的共享内存块, size 参数会被忽略。
close()¶
关闭实例对于共享内存的访问连接。所有实例确认自己不再需要使用共享内存的时候都应该调用 close() ,以保证必要的资源清理。调用 close() 并不会销毁共享内存区域。
unlink()¶
请求销毁底层的共享内存块。为了执行必要的资源清理, 在所有使用这个共享内存块的进程中, unlink() 应该调用一次(且只能调用一次) 。发出此销毁请求后,共享内存块可能会、也可能不会立即销毁,且此行为在不同操作系统之间可能不同。调用 unlink() 后再尝试方位其中的数据可能导致内存错误。注意: 最后一个关闭共享内存访问权限的进程可以以任意顺序调用 unlink() 和 close() 。
buf¶
共享内存块内容的 memoryview 。
name¶
共享内存块的唯一标识,只读属性。
size¶
共享内存块的字节大小,只读属性。
以下示例展示了 SharedMemory 底层的用法:
>>>from multiprocessing import shared_memory
>>>shm_a = shared_memory.SharedMemory(create=True, size=10)
>>>type(shm_a.buf)
>>>buffer = shm_a.buf
>>>len(