How does shared_memory circumvent the pickle treatment?
我认为您在进程之间混淆了共享ctypes和共享对象。在
首先,您不必使用multiprocessing提供的共享机制来获得共享对象,您只需包装基本原语,例如mmap/Windows等效物,或者使用您的操作系统/内核提供的任何API来获得更丰富的应用程序。在
接下来,您提到的关于如何执行复制以及__getstate__如何定义酸洗行为的第二个链接取决于您—使用sharedctypes模块API。在两个进程之间共享内存时,不必强制执行pickle。在
这两个实现都依赖于mmap样的原语。在
无论如何,如果您尝试使用sharedctype复制某些内容,您将单击:
这个函数使用ForkingPickler,它将使用pickle,然后……最终,你将在某处调用{}。在
但它与shared_memory无关,因为shared_memory并不是真正的ctype类对象。在
但你不能通过共享内存共享共享内存,对吧?在
创建一个具有唯一名称的内存块,并且在共享内存之前,所有进程都必须具有唯一名称,否则将无法附加它。在
基本上,类比是: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。在
结果,你为什么要腌呢?你可以。你完全可以把它腌制一下。但这可能不是内置的,因为只需通过另一个共享内存通道或类似的方式将唯一名称发送给所有进程是很简单的。在
它需要一个类似于唯一名称的东西,你也可以使用匿名共享内存,然后通过另一个通道传输它的名称(写一个临时文件,把它发回某个API,等等)。在Why then is CreateFileMapping \ OpenFileMapping needed here?
因为它取决于您的Python解释器,所以这里您可能正在使用CPython,它执行以下操作:
它已经间接地使用了CreateFileMapping,这样做CreateFileMapping然后附加它只是重复CPython中已经完成的工作。在
但是,其他口译员呢?是否所有的解释器都执行了使mmap在非POSIX平台上工作所必需的操作?也许开发者的基本原理是这样的。在
不管怎样,mmap能开箱即用也就不足为奇了。在