我读到RawArray
可以在不被复制的过程中共享,我想了解它是如何在Python中实现的。
我在sharedctypes.py中看到,RawArray
是由heap.py的BufferWrapper
构造的,然后用ctypes.memset
作废。
BufferWrapper
是由一个Arena
对象构成的,该对象本身是由一个mmap
构建的(或windows中的100个mmap,参见heap.py中的第40行)。
我读到mmap
系统调用实际上用于在Linux/BSD中分配内存,MapViewOfFile模块使用MapViewOfFile作为windows。
那么,mmap
似乎很方便。它似乎可以直接和mp.pool
一起工作-
from struct import pack
from mmap import mmap
def pack_into_mmap(idx_nums_tup):
idx, ints_to_pack = idx_nums_tup
pack_into(str(len(ints_to_pack)) + 'i', shared_mmap, idx*4*total//2 , *ints_to_pack)
if __name__ == '__main__':
total = 5 * 10**7
shared_mmap = mmap(-1, total * 4)
ints_to_pack = range(total)
pool = Pool()
pool.map(pack_into_mmap, enumerate((ints_to_pack[:total//2], ints_to_pack[total//2:])))
我的问题是-
多处理模块如何不像对“常规”python对象一样,在进程之间复制基于mmap
的RawArray
对象?
发布于 2019-06-08 08:54:23
[Python3.Docs]:基于多进程的并行性使用专有协议[Python3.Docs]:泡菜- Python对象序列化序列化/反序列化进程间交换的数据(从这里开始,术语是:泡菜/反泡菜)。
根据()
类可以进一步影响它们的实例如何被腌制;如果类定义了方法(),就会调用它,并将返回的对象作为实例的内容,而不是实例的字典的内容。如果缺少()方法,则会像往常一样对实例的_进行腌制。
从(Win变体) _Arena.__getstate__ (类链:_sharedctypes.RawArray -> heap.BufferWrapper -> heap.Heap -> heap.Arena)中可以看出,只有元数据(名称和大小)是针对Arena实例的,而不是缓冲区本身。
相反,在___setstate___中,缓冲区是基于(上面的)元数据构造的。
https://stackoverflow.com/questions/56495471
复制相似问题