- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试理解 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/
我正在学习 Python 中的共享内存,尤其是 python 3.8 模块 multiprocessing.shared_memory .我没有看到文档中提到锁定。 (虽然父模块 multiproce
我正在使用 multiprocessing.Pool它在 1 个或多个子进程中调用一个函数来生成大量数据。 工作进程创建一个 multiprocessing.shared_memory.SharedM
我正在尝试理解 shared_memory 的一些操作。 查看 source ,看起来该模块在 UNIX 环境中使用 shm_open(),在 Windows 上使用 CreateFileMappin
我正在使用 Python 3.8 的新 shared_memory 模块,但无法在未终止使用它的进程的情况下释放共享内存。 创建和使用共享内存块shm后,我在所有进程中通过shm.close()关闭它
我正在使用 boost shared_memory_manager 模板在共享内存中创建 vector : using namespace boost::interprocess; typedef a
我为我的应用程序创建了一个 1MB 的共享内存空间。 每个用户都是一个,只有一个包含一些信息的数组,可以从大约 10 个并发进程访问,并且在它的监视器上,用户可以看到每个进程的进度。 Evey 进程从
我是一名优秀的程序员,十分优秀!