首页 >后端开发 >Python教程 >如何在 Python 中使用共享内存中的 NumPy 数组进行多重处理?

如何在 Python 中使用共享内存中的 NumPy 数组进行多重处理?

Susan Sarandon
Susan Sarandon原创
2024-12-06 08:08:101022浏览

How Can I Use NumPy Arrays in Shared Memory for Multiprocessing in Python?

在共享内存中使用 NumPy 数组进行多处理

在 Python 中使用多处理时,在进程之间共享数组可能具有挑战性。如果您要求 NumPy 数组表现得像 NumPy 数组而不是简单的 ctypes 数组,那么在多处理中使用 NumPy 数组可能会遇到困难。

问题陈述

在提供的示例中,NumPy 数组包装在 ctypes Array() 对象中。虽然这允许以 ctypes 方式访问数组,但它失去了 NumPy 数组的功能。无法执行 -1*arr 或 arr.sum() 等操作,将其转换回 NumPy 数组会破坏共享内存。

使用shared_arr.get_lock()的解决方案

要在使用共享内存数组时保留 NumPy 数组功能,您可以使用共享内存数组中提供的 get_lock() 方法array:

shared_arr = mp.Array(ctypes.c_double, N)

def f(i):
    with shared_arr.get_lock():
        arr = np.frombuffer(shared_arr.get_obj())
        arr[i] = -arr[i]

通过使用 get_lock() 方法,可以同步对共享数组的访问,并确保在进程内像 NumPy 数组一样访问它。

示例

以下代码提供了一个改进的示例,它在利用共享的同时保留了 NumPy 数组功能内存:

import multiprocessing as mp
import numpy as np

N = 100
shared_arr = mp.Array(ctypes.c_double, N)
arr = np.frombuffer(shared_arr.get_obj())

# Fill the shared array with random values
arr[:] = np.random.uniform(size=N)

# Create a pool of processes
with mp.Pool(initializer=init, initargs=(shared_arr,)) as pool:

    # Define functions that modify the shared array
    def f(i):
        with shared_arr.get_lock():
            arr -= 1 # Subtract 1 from each array element within the process

    pool.map(f, range(N))

# Check the modified shared array
assert np.allclose(arr, -1)

在这个例子中,init()函数为每个进程设置shared_arr,f()函数对锁内的共享数组进行操作。加入池后,主进程就可以访问修改后的共享数组。此方法提供了一种同步且与 NumPy 兼容的方式来在多处理中使用共享数组。

以上是如何在 Python 中使用共享内存中的 NumPy 数组进行多重处理?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn