使用multiprocessing.shared_memory,Python版本要求3.8+,Windows和Linnux都适用,其原型如下,
# name: 共享内存名字,为None时会自动生成一个名字
# create: 是否创建共享内存,True则创建,False则使用已经存在的共享内存
# size: 希望创建的共享内存大小,create为True时有效(单位:byte)
class multiprocessing.shared_memory.SharedMemory(name=None, create=False, size=0)
进程间通过共享内存的名字来进行交互或者通信。
例子
进程A创建共享内存,名称为shmTest555666
from multiprocessing import shared_memory
shm = shared_memory.SharedMemory(name='shmTest555666', create=True, size=10)
buf = shm.buf
print('Process A, buf len: {}, {}'.format(len(buf), shm.size))
print('shm name: {}'.format(shm.name))
buf[:4] = bytearray([22, 33, 44, 55])
buf[4] = 100
while True:
if buf[4] == 200: # 当buf[4]变成200,就结束循环
break
shm.close() # 关闭共享内存
shm.unlink() # 释放共享内存,也可以由B进程释放
进程B使用A创建的共享内存,通过名字shmTest555666就可以找到A的共享内存,并进行修改,
from multiprocessing import shared_memory
shm = shared_memory.SharedMemory(name='shmTest555666')
buf = shm.buf
print('Process B, buf len: {}, {}'.format(len(buf), shm.size))
print('shm name: {}'.format(shm.name))
for i in range(10):
print('{} '.format(buf[i]), end='')
buf[4] = 200
print('')
本人在win10 64位系统下进行测试的,B进程得到的共享内存大小是4096,是一个内存页的大小,由此可见,操作系统分配内存的最小单位是4096字节,如下,
小结
multiprocessing.shared_memory对于进程间共享内存来说很方便,不过要求python版本是3.8及以上,使用时需要注意自己的python版本。
PS:这些Linux C早就有了…