使用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 之外实现的,或者通过使用多处理实现的。

在多进程中,这个内存拷贝是一个正常的进程。不仅如此,实际上在纯函数式编程中,函数的参数是不可变的,解决方案是在必要时始终复制内存。它在稳定性方面有很多优势,同时付出了可接受的性能损失。

基本上,将这些函数视为纯函数。