围绕现有数组创建共享内存(python)

Ada*_* S. 1 python shared-memory python-multiprocessing

我在任何地方看到 python 的共享内存实现(例如在 参考资料中multiprocessing),创建共享内存总是分配新内存。有没有办法创建共享内存对象并让它引用现有内存?目的是预先初始化数据值,或者更确切地说,如果我们已经有一个数组,则可以避免复制到新的共享内存中。根据我的经验,分配大型共享数组比将值复制到其中要快得多。

小智 5

最简洁的答案是不。

posix_ipc我是 Python 扩展1sysv_ipc2的作者。与标准库中的Pythonmultiprocessing模块一样,我的模块只是操作系统提供的设施的包装器,因此您真正需要知道的是操作系统在分配共享内存时允许做什么。SysV IPC 和 POSIX IPC 略有不同,但在这种情况下,差异并不重要。(我认为多处理尽可能使用 POSIX IPC。)

对于 SysV IPC,分配共享内存的操作系统级调用是shmget()。您可以在该调用的手册页上看到它不接受指向现有内存的指针;它总是为你分配新的内存。对于相同调用的 POSIX IPC 版本也是如此 ( shm_open())。POSIX IPC 很有趣,因为它实现共享内存,看起来像内存映射文件,因此它的行为与 SysV IPC 有点不同。

不管怎样,无论是从 Python 还是 C 调用,都无法要求操作系统将现有的私有内存转换为共享内存。

如果你想一想,你就会明白为什么。假设您可以将指向私有内存块的指针传递给shmget()or shm_open()。现在,操作系统的工作就是将内存保留在原来的位置,直到所有共享进程都使用它为止。如果它位于堆栈中间怎么办?突然间,你的堆栈的一大块无法分配,因为其他进程正在使用它。这也意味着当您的进程终止时,操作系统无法释放其所有内存,因为其中一些内存正在被其他进程使用。

简而言之,Python 没有提供您所要求的功能,因为底层操作系统调用不允许它,而底层操作系统调用也不允许它(可能),因为它对操作系统来说真的很混乱。