使用Python的射线模块时修改共享内存中的数据
Modify data in shared memory when using Python's ray module
我目前正在尝试使用 ray
模块并行化 Python
代码的某些部分。不幸的是,ray
默认不允许修改共享内存中的数据(至少根据我的理解)。这意味着我需要先执行 numpy.copy()
,这对我来说效率很低。
这可能是一个非常低效的例子:
import numpy as np
import ray
@ray.remote
def mod_arr( arr ):
arr_cp = np.copy(arr)
arr_cp += np.ones(arr_cp.shape)
return arr_cp
ray.init()
arr = np.zeros( (2,3,4) )
arr = ray.get(mod_arr.remote(arr))
如果我在函数 mod_arr()
中省略 np.copy()
并尝试修改 arr
,我会得到以下错误
ValueError: output array is read-only
我使用的 ray
是完全错误的,还是它不适合我的目的?
由于 Python 的 GIL,多个线程不能 运行 在 Python 上并行。因此,所有真正的并行性都是在模块发布 GIL 时在 Python 之外实现的,或者通过使用多处理实现的。
在多进程中,这个内存拷贝是一个正常的进程。不仅如此,实际上在纯函数式编程中,函数的参数是不可变的,解决方案是在必要时始终复制内存。它在稳定性方面有很多优势,同时付出了可接受的性能损失。
基本上,将这些函数视为纯函数。
我目前正在尝试使用 ray
模块并行化 Python
代码的某些部分。不幸的是,ray
默认不允许修改共享内存中的数据(至少根据我的理解)。这意味着我需要先执行 numpy.copy()
,这对我来说效率很低。
这可能是一个非常低效的例子:
import numpy as np
import ray
@ray.remote
def mod_arr( arr ):
arr_cp = np.copy(arr)
arr_cp += np.ones(arr_cp.shape)
return arr_cp
ray.init()
arr = np.zeros( (2,3,4) )
arr = ray.get(mod_arr.remote(arr))
如果我在函数 mod_arr()
中省略 np.copy()
并尝试修改 arr
,我会得到以下错误
ValueError: output array is read-only
我使用的 ray
是完全错误的,还是它不适合我的目的?
由于 Python 的 GIL,多个线程不能 运行 在 Python 上并行。因此,所有真正的并行性都是在模块发布 GIL 时在 Python 之外实现的,或者通过使用多处理实现的。
在多进程中,这个内存拷贝是一个正常的进程。不仅如此,实际上在纯函数式编程中,函数的参数是不可变的,解决方案是在必要时始终复制内存。它在稳定性方面有很多优势,同时付出了可接受的性能损失。
基本上,将这些函数视为纯函数。