在Python3中,共享内存主要用于多进程间高效的数据共享。Python标准库中的multiprocessing模块提供了两种方式实现共享内存:Value和Array,它们允许不同进程访问同一块内存区域。
下面是一个使用multiprocessing.Value和Array的简单示例:
使用 multiprocessing.Value:
import multiprocessing
# 创建一个整数值类型的共享内存
manager = multiprocessing.Manager()
shared_value = manager.Value('i', 0) # 'i' 表示整数类型
def increment_value(value):
"""子进程中增加共享内存值"""
for _ in range(10000):
with value.get_lock(): # 需要锁定以防止数据竞争
value.value += 1
if __name__ == "__main__":
# 创建两个子进程,每个都去增加共享变量
process1 = multiprocessing.Process(target=increment_value, args=(shared_value,))
process2 = multiprocessing.Process(target=increment_value, args=(shared_value,))
process1.start()
process2.start()
# 等待所有子进程完成
process1.join()
process2.join()
print(f"Final shared value: {shared_value.value}")
使用 multiprocessing.Array:
import multiprocessing
# 创建一个整数数组类型的共享内存
manager = multiprocessing.Manager()
shared_array = manager.Array('i', [0] * 10) # 'i' 表示整数类型,创建一个长度为10的数组
def update_array(array):
"""子进程中更新共享内存数组"""
for i in range(len(array)):
with array.get_lock():
array[i] += 1
if __name__ == "__main__":
processes = []
for _ in range(5): # 创建5个子进程
p = multiprocessing.Process(target=update_array, args=(shared_array,))
processes.append(p)
p.start()
# 等待所有子进程完成
for p in processes:
p.join()
print(f"Final shared array: {shared_array[:]}")
在Python3.8版本及以后,还有一个更底层的shared_memory模块可以用来创建命名的共享内存区:
import multiprocessing.shared_memory
# 创建一个新的共享内存区(假设我们想要存储一个长度为10的int数组)
shm = multiprocessing.shared_memory.SharedMemory(create=True, size=40) # 每个int占用4字节,所以总共需要40字节
# 将内存映射到本进程中并进行操作
array = shm.buf.cast('i')[:] # 假设我们将其视为整数数组
for i in range(10):
array[i] = i
# 在其他进程中也可以通过名称获取该共享内存区,并进行读写操作
# ...
# 当不再需要时,必须显式删除共享内存
shm.close()
multiprocessing.shared_memory.unlink(shm.name)
注意,直接使用shared_memory模块时,通常需要自己处理数据类型转换和同步问题。