shared_memory

multiprocessing.shared_memory(3.8)提供了一个SharedMemory类,用于分配和管理进程间的共享内存。
该模块中共享内存指的是System V类型的共享内存块,这种类型的共享内存允许不同进程读写一片公共的易失性存储区域。
通常,进程被限制只能访问属于自己进程空间的内存,公共共享内存允许跨进程共享数据,从而避免通过进程间发送消息的形式传递数据。比其他方式性能更好。

multiprocessing.shared_memory.SharedMemory(name=None, create=False, size=0)

- 创建一个新的共享内存块或者连接到一片已经存在的共享内存块。
- 共享内存块的寿命可能超过创建它的原始进程,一个共享内存块可能同时被多个进程使用,当一个进程不再需要访问这个共享内存块时,应调用close方法。当一个共享内存块不被任何进程使用的时候,应调用unlink()方法以执行必要的清理。
- name是共享内存的唯一名称。如果name为None,则会产生一个随机名称
- create为True则创建一个新的共享内存块,如果为False则连接到已存在的共享内存块。
- 新创建共享内存块需要指定size,即块的大小为多少字节。某些平台是以页大小为最小单位来分配内存,最终得到的内存块大小可能大于或等于要求的大小。如果是连接到已存在的共享内存块,size会被忽略。
  1. close(): 关闭对共享内存的访问,当进程不再需要使用共享内存的时候都应该调用close,以保证必要的资源清理。
  2. unlink(): 请求销毁底层的共享内存块。在所有使用这个共享内存的进程中unlink应该调用一次。共享内存块不一定会立即销毁不同操作系统之间可能不同。unlink后访问共享内存会导致内存错误。
  3. buf: 共享内存块内容的memoryview
  4. name: 共享内存块的唯一标识
  5. size:共享内存块的大小
# 在共享内存块中使用numpy数组
from multiprocessing.shared_memory import SharedMemory
import numpy as np

a = np.arange(10,dtype=np.int64)
shm = SharedMemory(create=True,size=a.nbytes)
b = np.ndarray(a.shape, dtype=a.dtype, buffer=shm.buf)
b[:] = a[:]
print(b)
shm.close()
shm.unlink()

multiprocessing.managers.SharedMemoryManager([address[,authkey]])

multiprocessing.managers.BaseManager的子类,可用于管理跨进程的内存块。
SharedMemoryManager的start方法会启动一个新进程,这个进程的唯一目的就是管理所有由他创建的共享内存块的生命周期。释放此进程管理的所有共享内存块,调用实例的shutdwon方法,会触发执行它管理的所有SharedMemory对象的SharedMemory.unlink()方法,然后停止这个进程。

  1. SharedMemory(size):创建一个size大小的ShareMemory
  2. ShareableList(sequence):使用sequence初始化一个ShareableList对象并返回

multiprocessing.shared_memory.ShareableList(sequence=None, *,name=None)

一个共享内存块中的类似list的对象。其可存储的值只能是int、float、bool、str(10M以内)、 bytes(10M)、None这些内置类型。长度不可变,不支持append和insert、不支持通过切片动态创建建新的SharealbeList。
- sequence会用了初始化ShareableList,如果为None则会基于唯一的共享内存名称关联到已存在的ShareableList。

  1. count(value)
  2. index(value)
  3. format:
  4. shm: 存储值的ShareMemory实例
from multiprocessing.managers import SharedMemoryManager

if __name__ == "__main__":
    with SharedMemoryManager() as manager:
        sharedable_list = manager.ShareableList(range(5))
        print(sharedable_list.count(1))
        print(sharedable_list.index(3))
        print(sharedable_list.shm)

两个进程修改一个ShareableList

from multiprocessing.managers import SharedMemoryManager
from multiprocessing import Process, Lock


def f(lst, lock1, lock2):
    """修改每个元素为其原来的平方"""
    for i in range(5):
        lock1.acquire()
        lst[i] = i**2
        lock2.release()

def g(lst,lock1, lock2):
    """修改每个元素为其对应的坐标值"""
    for i in range(5):
        lock2.acquire()
        lst[i]=i
        lock1.release()

if __name__ =="__main__":
    with SharedMemoryManager() as manager:
        slst = manager.ShareableList([0]*5)  # 创建一个共享list,初始化每个元素为0
        print(list(slst))
        # 使用两个锁交替释放,保证先允许g再运行f,先把每个元素改为其对应坐标值,再求其平方。
        lock1 = Lock()
        lock2 = Lock()
        lock1.acquire()
        p1 = Process(target=f, args=(slst, lock1, lock2))
        p2 = Process(target=g, args=(slst, lock1, lock2))
        p1.start()
        p2.start()
        p1.join()
        p2.join()
        print(list(slst))

posted @   店里最会撒谎白玉汤  阅读(481)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示