在Python中的两个子进程之间共享匿名mmap

问题描述 投票:0回答:1

我试图在两个不同的Python解释器之间创建一个高速共享缓冲区,为此我在/tmp中创建了一个文件,然后用它来创建mmap对象

 fd= os.open("file", os.O_CREAT | os.O_TRUNC | os.O_RDWR)
    assert os.write(fd2, bytes('\x00' * Size, encoding='utf-8')) == Size

  mem = mmap.mmap(fd, Size , mmap.MAP_SHARED, mmap.PROT_WRITE)

但后来我做了一些测试,我注意到如果我将 mmap 设为匿名,则共享缓冲区会快得多,那么有没有办法与两个 python 子进程共享匿名 mmap?

python subprocess mmap
1个回答
2
投票

MAP_ANONYMOUS
映射的内存只能与后代进程共享,即使这样也不能跨
execve
共享。但是,您不需要这个:加速的原因只是内存不再由磁盘支持,这可以通过其他方式实现。最便携的解决方案是使用
multiprocessing.shared_memory
,即使您不使用
multiprocessing
来运行进程,也可以使用它。示例:

from multiprocessing import shared_memory
shm = shared_memory.SharedMemory(create=True, size=4096)
shm.buf[0] = 42
print(shm.name)
print('Run the other program with the above name, then press Enter')
input()
print(shm.buf[0])
shm.close()
shm.unlink()
from multiprocessing import shared_memory
name = input("What was the name?")
shm = shared_memory.SharedMemory(name, track=False) # If your version of Python is too old to support the track parameter, then import resource_tracker too, and add the following right below this line: resource_tracker.unregister(shm._name, "shared_memory")
print(shm.buf[0])
shm.buf[0] += 1
shm.close()

您可以使用

shm.buf
就像在当前代码中使用
mem
一样。请注意,作为创建随机名称然后共享它的替代方法,您可以在创建共享内存时指定硬编码名称参数,但这样做会增加名称冲突的风险。

© www.soinside.com 2019 - 2024. All rights reserved.