Python 使用 mmap 和空文件共享内存
Python Shared Memory using mmap and empty files
我正在尝试为 Python 和 C/C++ 进程的任意组合之间的进程间通信创建一个快速库。 (i.e. Python <-> Python, Python <-> C++, or C++ <-> Python)
为了实现最快的实现,我正在尝试使用 mmap 来利用共享内存。计划是让两个进程通过“mmap-ing”同一个文件共享内存,并读写这个共享内存进行通信。
我想避免对真实文件进行任何实际写入,而只是想使用文件名作为两个进程连接的句柄。但是,我挂断了以下对 mmap
的调用:
self.memory = mmap.mmap(fileno, self.maxlen)
出现以下错误:
FileNotFoundError: [Errno 2] No such file or directory: 'shared_memory_file'
或者如果我创建一个空文件:
ValueError: mmap length is greater than file size
我是否需要简单地制作一个填充空值的空文件才能像这样使用共享内存?
如何在不相关的进程(不是父 <-> 子通信)之间使用 mmap 作为 Python 中的共享内存,C++ 也可以一起玩? (不使用 multiprocessing.shared_memory)
尽量直接回答问题:
文件需要适当调整大小才能映射。如果您需要更多 space,可以使用不同的方法...但最便携的可能是取消映射文件,在磁盘上调整文件大小,然后重新映射文件。参见:How to portably extend a file accessed using mmap()
您可以使用 MAP_ANONYMOUS|MAP_SHARED 进行 mmap,然后 fork,然后 运行 在两个进程中使用相同的共享内存。参见:Sharing memory between processes through the use of mmap()
或者,您可以创建一个 ramdisk,在其中创建一个特定大小的文件,然后映射到两个进程中。
请记住,您需要处理两个进程之间的同步 - 不同的平台可能对此有不同的方法,但它们传统上涉及使用某种信号量(例如在 Linux: https://man7.org/linux/man-pages/man7/sem_overview.7.html).
综上所述,传统的共享内存在这个用例中可能比 mmap 做得更好。一般来说,OS 级 IPC 机制开箱即用可能比手动解决方案做得更好 - 有很多调整可以使其表现良好,并且 mmap 并不总是自动的赢了。
祝项目顺利!
我正在尝试为 Python 和 C/C++ 进程的任意组合之间的进程间通信创建一个快速库。 (i.e. Python <-> Python, Python <-> C++, or C++ <-> Python)
为了实现最快的实现,我正在尝试使用 mmap 来利用共享内存。计划是让两个进程通过“mmap-ing”同一个文件共享内存,并读写这个共享内存进行通信。
我想避免对真实文件进行任何实际写入,而只是想使用文件名作为两个进程连接的句柄。但是,我挂断了以下对 mmap
的调用:
self.memory = mmap.mmap(fileno, self.maxlen)
出现以下错误:
FileNotFoundError: [Errno 2] No such file or directory: 'shared_memory_file'
或者如果我创建一个空文件:
ValueError: mmap length is greater than file size
我是否需要简单地制作一个填充空值的空文件才能像这样使用共享内存?
如何在不相关的进程(不是父 <-> 子通信)之间使用 mmap 作为 Python 中的共享内存,C++ 也可以一起玩? (不使用 multiprocessing.shared_memory)
尽量直接回答问题:
文件需要适当调整大小才能映射。如果您需要更多 space,可以使用不同的方法...但最便携的可能是取消映射文件,在磁盘上调整文件大小,然后重新映射文件。参见:How to portably extend a file accessed using mmap()
您可以使用 MAP_ANONYMOUS|MAP_SHARED 进行 mmap,然后 fork,然后 运行 在两个进程中使用相同的共享内存。参见:Sharing memory between processes through the use of mmap()
或者,您可以创建一个 ramdisk,在其中创建一个特定大小的文件,然后映射到两个进程中。
请记住,您需要处理两个进程之间的同步 - 不同的平台可能对此有不同的方法,但它们传统上涉及使用某种信号量(例如在 Linux: https://man7.org/linux/man-pages/man7/sem_overview.7.html).
综上所述,传统的共享内存在这个用例中可能比 mmap 做得更好。一般来说,OS 级 IPC 机制开箱即用可能比手动解决方案做得更好 - 有很多调整可以使其表现良好,并且 mmap 并不总是自动的赢了。
祝项目顺利!