共享内存是自python3.8开始引入的新功能。
1. 共享内存 – multiprocessing.shared_memory
multiprocessing.shared_memory
— 可跨进程直接访问的共享内存,是从python3.8 开始引入的功能。
该模块提供了一个 SharedMemory
类,用于分配和管理多核或对称多处理器(SMP)机器上进程间的共享内存。为了协助管理不同进程间的共享内存生命周期,multiprocessing.managers
模块也提供了一个 BaseManager
的子类: SharedMemoryManager
。
本模块中,共享内存是指 “System V 类型” 的共享内存块(虽然可能和它实现方式不完全一致)而不是 “分布式共享内存”。这种类型的的共享内存允许不同进程读写一片公共(或者共享)的易失性存储区域。一般来说,进程被限制只能访问属于自己进程空间的内存,但是共享内存允许跨进程共享数据,从而避免通过进程间发送消息的形式传递数据。相比通过磁盘、套接字或者其他要求序列化、反序列化和复制数据的共享形式,直接通过内存共享数据拥有更出色性能。
class multiprocessing.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
共享内存块的字节大小,只读属性。
示例1:展示了 SharedMemory
的基础用法
from multiprocessing import shared_memory
import array
if __name__ == '__main__':
shm_a = shared_memory.SharedMemory(create=True, size=40)
print('type: ', type(shm_a))
print('name: ', shm_a.name)
print('size: ', shm_a.size)
buffer = shm_a.buf
buffer[:4] = bytearray([22, 33, 44, 55]) # Modify multiple at once
print('buffer_a: ', [i for i in bytes(buffer[:4])])
buffer[4] = 100 # Modify single byte at a time
print('buffer_a: ', [i <