📜  共享 SHMEM python (1)

📅  最后修改于: 2023-12-03 15:22:33.511000             🧑  作者: Mango

共享 SHMEM Python

在 Python 中,我们可以使用共享内存来实现在多个进程或线程间共享数据。共享内存是指多个进程共同使用同一块内存空间,这样可以避免进程间通信的开销,提高程序的效率。在 Python 中,我们可以使用 multiprocessing.shared_memory 模块来实现共享内存的操作。

创建共享内存

要使用共享内存,首先需要创建一块共享内存。可以使用 multiprocessing.shared_memory.SharedMemory 类来创建一块共享内存,示例如下:

import multiprocessing

# 创建一块名为 data 的共享内存,大小为 1024 字节
shm = multiprocessing.shared_memory.SharedMemory(create=True, size=1024, name='data')

上述代码中,create=True 表示创建一块新的共享内存,size 表示共享内存的大小,name 表示共享内存的名称。

向共享内存中写入数据

创建共享内存后,就可以向其中写入数据了。可以使用 mmap 方法来将共享内存映射到当前进程的地址空间,然后直接修改内存中的数据。示例如下:

import mmap

# 将共享内存 shm 映射到当前进程的地址空间
mm = mmap.mmap(shm.fd, shm.size)

# 将字符串写入共享内存
mm.write(b'hello world')

# 关闭共享内存映射
mm.close()

# 关闭共享内存
shm.close()

注意,这里需要使用 mmap 方法将共享内存映射到当前进程的地址空间,并且需要显式地关闭共享内存映射和共享内存。

从共享内存中读取数据

读取共享内存中的数据也很容易,可以直接读取共享内存中的数据。示例如下:

import mmap

# 将共享内存 shm 映射到当前进程的地址空间
mm = mmap.mmap(shm.fd, shm.size)

# 从共享内存中读取字符串
data = mm.read(11)
print(data)  # 输出 b'hello world'

# 关闭共享内存映射
mm.close()

# 关闭共享内存
shm.close()
使用多进程共享内存

使用多进程共享内存需要注意的是,每个进程都要先创建一块共享内存,然后再将其映射到当前进程的地址空间中。示例如下:

import multiprocessing
import mmap

# 创建一块名为 data 的共享内存,大小为 1024 字节
shm = multiprocessing.shared_memory.SharedMemory(create=True, size=1024, name='data')

# 在子进程中将共享内存映射到当前进程的地址空间
p = multiprocessing.Process(target=func, args=(shm.name,))
p.start()
p.join()

# 在主进程中读取共享内存
mm = mmap.mmap(shm.fd, shm.size)
data = mm.read(11)
print(data)  # 输出 b'hello world'

# 关闭共享内存映射
mm.close()

# 关闭共享内存
shm.close()

def func(shm_name):
    # 将共享内存 shm 映射到当前进程的地址空间
    shm = multiprocessing.shared_memory.SharedMemory(name=shm_name)
    mm = mmap.mmap(shm.fd, shm.size)

    # 往共享内存中写入数据
    mm.write(b'hello world')

    # 关闭共享内存映射
    mm.close()

    # 关闭共享内存
    shm.close()

上述代码中,先在主进程中创建一块共享内存,然后在子进程中将其映射到当前进程的地址空间中,并往其中写入数据。最后在主进程中读取共享内存中的数据。注意,使用多进程共享内存时,要先将共享内存映射到当前进程的地址空间,然后再修改其中的数据。另外,同一块共享内存可以被多个进程同时访问,但要注意进程间的同步问题。