在多处理场景中,通过确保共享数据是优化资源使用至关重要不会跨多个进程重复。了解在这些情况下如何处理只读数据可以节省大量内存和性能开销。
考虑以下 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中文网其他相关文章!