多处理可以共享只读共享数据而不进行复制吗?

Barbara Streisand
发布: 2024-10-25 02:46:30
原创
147 人浏览过

Can Multiprocessing Share Read-Only Shared Data Without Replication?

多处理会复制只读共享数据吗?

简介

在多处理场景中,通过确保共享数据是优化资源使用至关重要不会跨多个进程重复。了解在这些情况下如何处理只读数据可以节省大量内存和性能开销。

问题

考虑以下 Python 代码:

<code class="python">glbl_array = # a 3 Gb array

def my_func(args, def_param=glbl_array):
    # do stuff on args and def_param

if __name__ == '__main__':
    pool = Pool(processes=4)
    pool.map(my_func, range(1000))</code>
登录后复制

我们能否保证或者鼓励不同的进程共享glbl_array而不创建单独的副本?

答案

为了确保共享访问而不重复,我们可以利用Python中多处理模块提供的共享内存机制。下面是它的实现方式:

<code class="python">import multiprocessing
import ctypes
import numpy as np

shared_array_base = multiprocessing.Array(ctypes.c_double, 10 * 10)
shared_array = np.ctypeslib.as_array(shared_array_base.get_obj())
shared_array = shared_array.reshape(10, 10)

# Parallel processing
def my_func(i, def_param=shared_array):
    shared_array[i, :] = i

if __name__ == '__main__':
    pool = multiprocessing.Pool(processes=4)
    pool.map(my_func, range(10))

    print(shared_array)</code>
登录后复制

实现细节

代码使用 multiprocessing.Array 类创建一个共享内存数组 (shared_array_base)。然后将其转换为 Numpy 数组(shared_array)以方便操作。

主函数(my_func)将shared_array作为默认参数,以避免不必要的复制,Linux的copy-on-write语义确保数据重复仅当对共享区域进行修改时才会发生。

通过运行代码,您会注意到共享的shared_array 被打印出来,没有任何重复,这表明进程共享相同的内存对象。

以上是多处理可以共享只读共享数据而不进行复制吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!