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

share anonymous mmap between two subprocesses in python

我正在尝试在两个不同的 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?

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, resource_tracker
name = input("What was the name?")
shm = shared_memory.SharedMemory(name)
resource_tracker.unregister(shm._name, "shared_memory") # work around https://bugs.python.org/issue38119
print(shm.buf[0])
shm.buf[0] += 1
shm.close()

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