多处理.RawArray 操作

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 对象所做的那样?

Cri*_*ati 3

[Python 3.Docs]:多处理 - 基于进程的并行性使用专有协议序列化/反序列化进程之间交换的数据:[Python 3.Docs]:pickle - Python 对象序列化(以及此处的术语:pickle / unpickle)。

\n\n

根据[Python 3.Docs]:pickle - 对象。__getstate__ ()

\n\n
\n

类可以进一步影响其实例的腌制方式;如果类定义了方法__getstate__(),则调用该方法并将返回的对象腌制为实例的内容,而不是instance\xe2\x80\x99s 字典的内容。如果__getstate__()方法不存在,则实例\xe2\x80\x99s __dict__会像往常一样进行腌制。

\n
\n\n

如( Win变体)Arena.__getstate__中所示,(类链:sharedctypes.RawArray -> heap.BufferWrapper -> heap.Heap -> heap.Arena),只有元数据(名称大小)为Arena实例进行腌制,但不是缓冲区本身。

\n\n

相反,在__setstate__中,缓冲区是基于(上面的)元数据构建的。

\n