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

2024-10-01 17:35:22 发布

您现在位置: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呢


Tags: 文件对象sizeosassertopen解释器tmp
1条回答
网友
1楼 · 发布于 2024-10-01 17:35:22

MAP_ANONYMOUS映射的内存只能与子进程共享,甚至不能跨execve共享。但是,您不需要这样做:加速的原因只是内存不再由磁盘支持,这可以通过其他方式实现。最可移植的解决方案是使用^{},即使没有使用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。请注意,作为创建随机名称然后共享的替代方法,您可以在创建共享内存时指定硬编码名称参数,但这样做会增加名称冲突的风险

相关问题 更多 >

    热门问题