首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >multiprocessing.RawArray手术

multiprocessing.RawArray手术
EN

Stack Overflow用户
提问于 2019-06-07 13:41:37
回答 1查看 1.4K关注 0票数 4

我读到RawArray可以在不被复制的过程中共享,我想了解它是如何在Python中实现的。

我在sharedctypes.py中看到,RawArray是由heap.pyBufferWrapper构造的,然后用ctypes.memset作废。

BufferWrapper是由一个Arena对象构成的,该对象本身是由一个mmap构建的(或windows中的100个mmap,参见heap.py中的第40行)。

我读到mmap系统调用实际上用于在Linux/BSD中分配内存,MapViewOfFile模块使用MapViewOfFile作为windows。

那么,mmap似乎很方便。它似乎可以直接和mp.pool一起工作-

代码语言:javascript
运行
复制
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对象一样,在进程之间复制基于mmapRawArray对象?

EN

Stack Overflow用户

回答已采纳

发布于 2019-06-08 08:54:23

[Python3.Docs]:基于多进程的并行性使用专有协议[Python3.Docs]:泡菜- Python对象序列化序列化/反序列化进程间交换的数据(从这里开始,术语是:泡菜/反泡菜)。

根据()

类可以进一步影响它们的实例如何被腌制;如果类定义了方法(),就会调用它,并将返回的对象作为实例的内容,而不是实例的字典的内容。如果缺少()方法,则会像往常一样对实例的_进行腌制。

从(Win变体) _Arena.__getstate__ (类链:_sharedctypes.RawArray -> heap.BufferWrapper -> heap.Heap -> heap.Arena)中可以看出,只有元数据(名称和大小)是针对Arena实例的,而不是缓冲区本身。

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

票数 3
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56495471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档