gpt4 book ai didi

python - 了解 Python 3.8 中的 shared_memory

转载 作者:太空狗 更新时间:2023-10-29 19:27:01 26 4
gpt4 key购买 nike

我正在尝试理解 shared_memory 的一些操作。

查看 source ,看起来该模块在 UNIX 环境中使用 shm_open(),在 Windows 上使用 CreateFileMapping\OpenFileMapping,并结合 mmap.

我从here了解到,为了避免 pickle 进行彻底的序列化/反序列化,需要为他的共享显式实现 __setstate__()__getstate__()数据类型。

我在 shared_memory.py 中没有看到任何这样的实现。

shared_memory 如何绕过 pickle 处理?

此外,在 Windows 机器上,仅此一项似乎就可以跨解释器生存:

from mmap import mmap

shared_size = 12
shared_label = "my_mem"

mmap(-1, shared_size , shared_label)

为什么这里需要CreateFileMapping\OpenFileMapping

最佳答案

How does shared_memory circumvent the pickle treatment?

我认为您混淆了进程之间的共享 ctypes共享对象

首先,您不必使用 multiprocessing 提供的共享机制为了获得共享对象,您可以只包装基本原语,例如 mmap/Windows 等效或使用您的操作系统/内核为您提供的任何 API 变得更有趣。

接下来,您提到的第二个链接是关于如何完成复制以及如何 __getstate__定义 pickling 的行为取决于你——使用 sharedctypes模块API。您不会被迫执行 pickle 以在两个进程之间共享内存。

事实上,sharedctypes由使用匿名共享内存支持:https://github.com/python/cpython/blob/master/Lib/multiprocessing/heap.py#L31

两种实现都依赖于 mmap -像原始人一样。

无论如何,如果您尝试使用 sharedctype 复制某些内容,你会打:

这个函数使用了ForkingPickler这将使用 pickle然后......最终,你会调用__getstate__某处。

但与shared_memory无关,因为 shared_memory不是真正的 ctype -像对象。

您可以使用其他方式在进程之间共享对象,使用 Resource Sharer/Tracker API:https://github.com/python/cpython/blob/master/Lib/multiprocessing/resource_sharer.py这将依赖 pickle序列化/反序列化。

但是你不会通过共享内存来共享共享内存吧?

当您使用:https://github.com/python/cpython/blob/master/Lib/multiprocessing/shared_memory.py

您创建了一个具有唯一名称的内存块,所有进程在共享该内存之前必须具有唯一名称,否则您将无法附加它。

基本上,类比是:

You have a group of friends and you all have a unique secret base that only you have the location, you will go on errands, be away from each other, but you can all meet at this unique location.

为了使此功能起作用,你们必须在彼此离开之前都知道位置。如果你事先没有,你不确定你能找到与他们见面的地方。

这与 shared_memory 相同, 你只需要它的名字就可以打开它。你不分享/转让shared_memory进程之间。你读入shared_memory使用来自多个进程的唯一名称。

结果,你为什么要 pickle 它?你可以。你绝对可以 pickle 它。但这可能不是内置的,因为通过另一个共享内存 channel 或类似的东西将唯一名称发送到所有进程很简单。

这里不需要规避。 ShareableList只是SharedMemory的应用示例类(class)。正如您在这里看到的:https://github.com/python/cpython/blob/master/Lib/multiprocessing/shared_memory.py#L314

它需要类似于唯一名称的东西,您也可以使用匿名共享内存,稍后通过另一个 channel 传输它的名称(写一个临时文件,将它发送回某个 API,等等)。

Why then is CreateFileMapping \ OpenFileMapping needed here?

因为它取决于您的 Python 解释器,所以您在这里可能正在使用 CPython,它正在执行以下操作:

https://github.com/python/cpython/blob/master/Modules/mmapmodule.c#L1440

它已经在使用 CreateFileMapping间接地做CreateFileMapping然后附加它只是复制 CPython 中已经完成的工作。

但是,其他口译员呢?所有口译员是否都执行必要的工作来制作mmap在非 POSIX 平台上工作?也许开发者的理由是这样的。

无论如何,mmap 并不奇怪开箱即用。

关于python - 了解 Python 3.8 中的 shared_memory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56877636/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com