一、介绍
模块提供了一个类 SharedMemory
,用于分配和管理共享内存,供多核或对称多处理器 (SMP) 机器上的一个或多个进程访问。 为了协助共享内存的生命周期管理,尤其是跨不同进程的共享内存,multiprocessing.managers
模块中还提供了一个 BaseManager 子类 SharedMemoryManager
。
在这个模块中,共享内存指的是“System V 风格”的共享内存块(尽管不一定如此显式地实现),而不是指“分布式共享内存”。 这种类型的共享内存允许不同的进程潜在地读取和写入
易失性内存的公共(或共享)区域。
进程通常被限制为只能访问自己的进程内存空间,但共享内存允许在进程之间共享数据
,从而避免需要在包含该数据的进程之间发送消息。 与通过磁盘或套接字或其他需要序列化/反序列化和复制数据的通信共享数据相比,直接通过内存共享数据可以提供显着的性能优势。
二、函数介绍
参数
def __init__(self, name=None, create=False, size=0)
-
name (str | None):请求的共享内存的唯一名称,指定为字符串。 在创建新的共享内存块时,如果该值
None
(默认值),则会生成一个新名称。 -
create (bool):是创建新的共享内存块(
True
)还是附加现有的共享内存块(False
)【即使用已用的共享内存块】。 -
size (int):指定创建新共享内存块时请求的字节数。 由于某些平台选择根据该平台的内存页大小分配内存块,因此共享内存块的确切大小可能大于或等于请求的大小。 当附加到现有共享内存块时,
size
参数将被忽略。
方法
-
close():关闭该实例对共享内存的访问。为确保正确清理资源,所有实例都应当在实例不再被需要时调用
close()
。 请注意调用close()
并不会导致共享内存块本身被销毁。 -
unlink():请求销毁底层的共享内存块。为了执行必要的清理,在所有需要使用这个共享内存块的进程中
unlink()
应当被调用一次(且仅有一次)。 在发出此销毁请求后,共享内存块可能会也可能不会被立即销毁,并且此行为在不同系统平台上可能不同。在unlink()
已被调用后再尝试访问共享内存块中的数据可能导致内存访问错误。 - buf:共享内存块内容的 memory view 。
- name:共享内存块的唯一标识,只读属性。
- size:共享内存块的字节大小,只读属性。
注意:最后一个结束持有共享内存块的进程可能以任意顺序调用 unlink()
和 close()
。
三、代码测试
测试代码1
# -*- coding:utf-8 -*-
# @author: 木子川
# @微信公众号: AI算法与电子竞赛
# @Email: m21z50c71@163.com
# @VX:fylaicai
from multiprocessing import Process
from multiprocessing import shared_memory
import numpy as np
# 生产者进程:创建共享内存块并存储数据
def producer():
data = np.array([1, 2, 3, 4, 5])
shm = shared_memory.SharedMemory(name="parameter_data", create=True, size=data.nbytes)
array = np.ndarray(data.shape, dtype=data.dtype, buffer=shm.buf)
array[:] = data
print(f"Producer stored data in shared memory: {array}")
return shm
# 消费者进程:连接到共享内存块并取出数据
def consumer(name):
shm = shared_memory.SharedMemory(name=name, create=False)
array = np.ndarray((5,), dtype=np.int32, buffer=shm.buf)
print(f"Consumer retrieved data from shared memory: {array * 2}")
shm.close()
if __name__ == "__main__":
# 生产者进程存储数据到共享内存
shm = producer()
# 消费者进程连接到共享内存并取出数据
# consumer(shm.name)
p = Process(target=consumer, args=(shm.name,))
p.start()
p.join()
# 删除共享内存块
shm.unlink()
测试代码2
发送
# -*- coding:utf-8 -*-
# @author: 木子川
# @微信公众号: AI算法与电子竞赛
# @Email: m21z50c71@163.com
# @VX:fylaicai
from multiprocessing import shared_memory
import numpy as np
import time
# 生产者进程:创建共享内存块并存储数据
def producer():
make_mem = 1
while True:
data = np.array([1, 2, 3, 4, 5])
for i in range(10):
if make_mem == 1:
shm = shared_memory.SharedMemory(name='parameter_data', create=True, size=20)
make_mem = 0
else:
shm = shared_memory.SharedMemory(name='parameter_data', create=False, size=20)
array = np.ndarray(data.shape, dtype=data.dtype, buffer=shm.buf)
data += 1
array[:] = data
print(f"{i} Producer stored data in shared memory: {array}")
time.sleep(1)
if __name__ == "__main__":
producer()
接收
# -*- coding:utf-8 -*-
# @author: 木子川
# @微信公众号: AI算法与电子竞赛
# @Email: m21z50c71@163.com
# @VX:fylaicai
from multiprocessing import shared_memory
import numpy as np
import time
# 消费者进程:连接到共享内存块并取出数据
def consumer():
while True:
shm = shared_memory.SharedMemory(name='parameter_data', create=False, size=20)
array = np.ndarray((5,), dtype=np.int32, buffer=shm.buf)
print(f"Consumer retrieved data from shared memory: {array}")
time.sleep(0.9)
if __name__ == "__main__":
consumer()
四、书籍推荐
推荐一本书籍,全网第一份Pytorch函数常用手册,包括Tensors介绍、基础函数介绍、数据处理函数、优化函数、CUDA编程、多处理等十四章内容,文章中含有大量的实例来加深对函数的使用技巧。
关注下方公众号:@AI算法与电子竞赛,回复关键字 “PDF” 获取下载地址。
multiprocessing.shared_memory --- 从进程直接访问的共享内存(1)
五、链接作者
欢迎关注我的公众号:@AI算法与电子竞赛
文章来源:https://www.toymoban.com/news/detail-855328.html
硬性的标准其实限制不了无限可能的我们,所以啊!少年们加油吧!文章来源地址https://www.toymoban.com/news/detail-855328.html
到了这里,关于multiprocessing.shared_memory --- 从进程直接访问的共享内存(1)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!