理解python3.8中的共享内存

2024-10-01 17:24:05 发布

您现在位置:Python中文网/ 问答频道 /正文

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

看一下source,该模块在UNIX环境中使用shm_open(),在windows上使用CreateFileMapping\OpenFileMapping,并结合使用mmap。在

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

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

如何规避腌菜处理?在

另外,在Windows计算机上,只有这一点在accross解释器中仍然存在:

from mmap import mmap

shared_size = 12
shared_label = "my_mem"

mmap(-1, shared_size , shared_label)

那么为什么这里需要CreateFileMapping\OpenFileMapping?在


Tags: 模块sourcesize序列化环境windowsunixopen
1条回答
网友
1楼 · 发布于 2024-10-01 17:24:05

How does shared_memory circumvent the pickle treatment?

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

首先,您不必使用multiprocessing提供的共享机制来获得共享对象,您只需包装基本原语,例如mmap/Windows等效物,或者使用您的操作系统/内核提供的任何API来获得更丰富的应用程序。在

接下来,您提到的关于如何执行复制以及__getstate__如何定义酸洗行为的第二个链接取决于您—使用sharedctypes模块API。在两个进程之间共享内存时,不必强制执行pickle。在

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

这两个实现都依赖于mmap样的原语。在

无论如何,如果您尝试使用sharedctype复制某些内容,您将单击:

这个函数使用ForkingPickler,它将使用pickle,然后……最终,你将在某处调用{}。在

但它与shared_memory无关,因为shared_memory并不是真正的ctype类对象。在

您还有其他方法在进程之间共享对象,使用资源共享器/跟踪器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。在

结果,你为什么要腌呢?你可以。你完全可以把它腌制一下。但这可能不是内置的,因为只需通过另一个共享内存通道或类似的方式将唯一名称发送给所有进程是很简单的。在

这里不需要规避。ShareableList只是SharedMemory类应用的一个例子。如您所见:https://github.com/python/cpython/blob/master/Lib/multiprocessing/shared_memory.py#L314

它需要一个类似于唯一名称的东西,你也可以使用匿名共享内存,然后通过另一个通道传输它的名称(写一个临时文件,把它发回某个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能开箱即用也就不足为奇了。在

相关问题 更多 >

    热门问题