多处理.RawArray 操作

2024-03-31

我读到了RawArray可以在进程之间共享而无需复制,并且想了解它在Python中是如何实现的。

我看到在共享ctypes.py https://github.com/python/cpython/blob/master/Lib/multiprocessing/sharedctypes.py,那一个RawArray是由一个BufferWrapper from heap.py https://github.com/python/cpython/blob/master/Lib/multiprocessing/heap.py,然后用ctypes.memset.

BufferWrapper是由一个Arena对象,它本身是由mmap(或者 Windows 中的 100 个 mmap,请参见第 40 行heap.py https://github.com/python/cpython/blob/master/Lib/multiprocessing/heap.py)

我读到mmapLinux/BSD中系统调用实际上是用来分配内存的,Python模块使用文件映射视图 https://learn.microsoft.com/en-us/windows/desktop/api/memoryapi/nf-memoryapi-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:])))

我的问题是 -

多处理模块如何知道不复制mmap based RawArray进程之间的对象,就像“常规”Python 对象一样?


[Python 3.Docs]:多处理 - 基于进程的并行性 https://docs.python.org/3/library/multiprocessing.html?highlight=process#module-multiprocessing使用专有协议序列化/反序列化进程之间交换的数据:[Python 3.Docs]:pickle - Python 对象序列化 https://docs.python.org/3/library/pickle.html#module-pickle(以及从这里开始的条款:pickle / unpickle).

根据[Python 3.Docs]:pickle - 对象。__获取状态__() https://docs.python.org/3/library/pickle.html#object.__getstate__:

类可以进一步影响其实例的腌制方式;如果类定义了方法__getstate__() https://docs.python.org/3/library/pickle.html#object.__getstate__,它被调用,返回的对象被腌制为实例的内容,而不是实例字典的内容。如果__getstate__() https://docs.python.org/3/library/pickle.html#object.__getstate__方法不存在,实例的__dict__ https://docs.python.org/3/library/stdtypes.html#object.__dict__像平常一样腌制。

正如在(Win的变体)竞技场.__getstate__,(类链:sharedctypes.RawArray -> heap.BufferWrapper -> heap.Heap -> heap.Arena),只有元数据(name and size) are pickled为了Arena实例,但不是缓冲区本身。

相反,在__设置状态__,缓冲区是基于(上述)元数据构建的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多处理.RawArray 操作 的相关文章

随机推荐