Jay*_*Jay 5 ctypes mmap multiprocessing python-3.x
我读到RawArray可以在进程之间共享而无需复制,并且想了解它在 Python 中是如何实现的。
我在sharedctypes.py中看到, a是从heap.pyRawArray中的a 构造的,然后用 取消。BufferWrapperctypes.memset
BufferWrapper由一个对象组成Arena,该对象本身是由一个mmap(或 Windows 中的 100 个 mmap,请参见heap.py中的第 40 行)构建的
我读到mmap系统调用实际上是在Linux/BSD中用于分配内存的,而Python模块在windows中使用MapViewOfFile 。
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:])))
Run Code Online (Sandbox Code Playgroud)
我的问题是 -
多处理模块如何知道不要在进程之间复制mmap基础RawArray对象,就像它对“常规”Python 对象所做的那样?
[Python 3.Docs]:多处理 - 基于进程的并行性使用专有协议序列化/反序列化进程之间交换的数据:[Python 3.Docs]:pickle - Python 对象序列化(以及此处的术语:pickle / unpickle)。
\n\n根据[Python 3.Docs]:pickle - 对象。__getstate__ ():
\n\n\n\n\n类可以进一步影响其实例的腌制方式;如果类定义了方法__getstate__(),则调用该方法并将返回的对象腌制为实例的内容,而不是instance\xe2\x80\x99s 字典的内容。如果__getstate__()方法不存在,则实例\xe2\x80\x99s __dict__会像往常一样进行腌制。
\n
如( Win变体)Arena.__getstate__中所示,(类链:sharedctypes.RawArray -> heap.BufferWrapper -> heap.Heap -> heap.Arena),只有元数据(名称和大小)为Arena实例进行腌制,但不是缓冲区本身。
\n\n相反,在__setstate__中,缓冲区是基于(上面的)元数据构建的。
\n| 归档时间: |
|
| 查看次数: |
1585 次 |
| 最近记录: |