Jay*_*Jay 10 python mmap pickle shared-memory python-multiprocessing
我正在尝试了解的某些shared_memory操作。
查看源代码,看起来该模块shm_open()用于UNIX环境,并且Windows上的CreateFileMapping\ OpenFileMapping与结合使用mmap。
我从这里了解到,为了避免通过进行彻底的序列化/反序列化pickle,必须为他的共享数据类型实现__setstate__()并__getstate__()明确实现。
我在中看不到任何此类实现shared_memory.py。
如何shared_memory避开泡菜处理?
而且,在Windows机器上,仅此一项似乎在所有解释器中都可以幸免:
from mmap import mmap
shared_size = 12
shared_label = "my_mem"
mmap(-1, shared_size , shared_label)
Run Code Online (Sandbox Code Playgroud)
为什么在这里需要CreateFileMapping\ OpenFileMapping?
Rai*_*ito 11
如何
shared_memory规避泡菜处理?
我认为您混淆了进程之间的共享 ctypes和共享对象。
首先,您不必使用 提供的共享机制multiprocessing来获取共享对象,您可以只包装基本原语,例如mmap/ Windows-equivalent 或使用您的操作系统 / 内核为您提供的任何 API 变得更高级。
接下来,您提到的关于如何完成复制以及如何__getstate__定义酸洗行为的第二个链接取决于您——使用sharedctypes模块 API。您不必执行酸洗以在两个进程之间共享内存。
事实上,sharedctypes由匿名共享内存支持,它使用: https //github.com/python/cpython/blob/master/Lib/multiprocessing/heap.py#L31
两种实现都依赖于mmap-like 原语。
无论如何,如果您尝试使用 复制某些内容sharedctype,您将点击:
这个函数正在使用ForkingPicklerwhich 将使用pickle然后......最终,你会调用__getstate__某个地方。
但它与 无关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
你创建了一个具有唯一名称的内存块,所有进程在共享内存之前必须具有唯一的名称,否则你将无法附加它。
基本上,类比是:
你有一群朋友,你们都有一个独特的秘密基地,只有你有位置,你会去跑腿,彼此疏远,但你们都可以在这个独特的地方见面。
为了让它起作用,你们必须在彼此离开之前都知道位置。如果您事先没有它,您就不确定是否能够找到与他们会面的地点。
这与 相同shared_memory,你只需要它的名字就可以打开它。您不在shared_memory进程之间共享/传输。您shared_memory从多个进程中读到使用其唯一名称。
结果,你为什么要腌它?你可以。你绝对可以腌制它。但这可能不是内置的,因为通过另一个共享内存通道或类似的东西将唯一名称发送到所有进程很简单。
这里不需要规避。ShareableList只是SharedMemory类应用的一个例子。正如你在这里看到的:https : //github.com/python/cpython/blob/master/Lib/multiprocessing/shared_memory.py#L314
它需要类似于唯一名称的东西,您也可以使用匿名共享内存并稍后通过另一个通道传输其名称(写入临时文件,将其发送回某个 API,等等)。
那么为什么这里需要 CreateFileMapping \ OpenFileMapping 呢?
因为这取决于您的 Python 解释器,所以您可能正在使用 CPython,它正在执行以下操作:
https://github.com/python/cpython/blob/master/Modules/mmapmodule.c#L1440
它已经在CreateFileMapping间接使用,因此执行CreateFileMapping然后附加它只是复制 CPython 中已经完成的工作。
但是,其他口译员呢?是否所有解释器都执行mmap在非 POSIX 平台上工作所需的工作?也许开发商的理由是这样的。
无论如何,mmap开箱即用并不奇怪。
| 归档时间: |
|
| 查看次数: |
1027 次 |
| 最近记录: |