【问题标题】:Python Shared Memory using mmap and empty files使用 mmap 和空文件的 Python 共享内存
【发布时间】:2021-05-16 12:20:03
【问题描述】:

我正在尝试为 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

我是否需要简单地创建一个用空值填充的空文件才能像这样使用共享内存?

如何在 Python 中以 C++ 也可以使用的方式在不相关的进程(不是父子通信)之间使用 mmap 共享内存? (不使用 multiprocessing.shared_memory)

【问题讨论】:

  • 如果你想拥有一个由物理文件支持的共享内存,你必须有一个文件,并且文件必须有足够的大小。如果你不需要物理文件来支持你的内存,而只是想要一个共享段,你可以使用创建没有文件的共享内存的函数,分别是 SysV shmget 和朋友,或 Posix shm_open 和他们的朋友.
  • @SergeyA,您能否将我链接到在 Python 中执行此操作的好资源?有没有跨平台的方法?

标签: python c++ ipc shared-memory


【解决方案1】:

尽我所能直接回答问题:

  • 在映射之前需要适当调整文件的大小。如果您需要更多空间,有不同的方法可以做到......但大多数便携式可能会取消映射文件,调整磁盘上的文件大小,然后重新映射文​​件。见: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 做得更好。一般来说,操作系统级别的 IPC 机制开箱即用可能比手动解决方案做得更好 - 需要进行大量调整才能使其表现良好,而 mmap 并不总是自动获胜。

祝项目顺利!

【讨论】:

  • “传统共享内存”,我不确定你的意思。请原谅我的无知,但如果您能将我链接到一些很好的资源,以便在 C/C++ 和 Python 中学习这方面的知识,我将不胜感激。
  • 基本上,multiprocessing.shared_memory 在幕后做了什么。但是,无需调用该代码也可以执行相同的操作:请参阅 Windows 的 stackoverflow.com/questions/26114518/… 和 Linux 的 themetabytes.com/2018/05/26/python-inter-process-communication(“没有备份文件的共享内存”)。
  • 另外,如果您对真正快速推送数据感兴趣,concurrencykit.org 有一些不错的阅读材料——那里的文章和幻灯片都不错(我认为)。如果您想要更全面的东西,也建议mirrors.edge.kernel.org/pub/linux/kernel/people/paulmck/… - 这本身并不是共享内存的深入入门,但它是理解线程间和跨线程的不同方法的好资源过程沟通。希望里面的东西有用!
猜你喜欢
  • 1970-01-01
  • 2015-08-30
  • 1970-01-01
  • 2018-05-07
  • 2014-10-01
  • 2016-08-14
  • 1970-01-01
  • 2014-02-14
  • 2012-10-24
相关资源
最近更新 更多