在 Ray 中的演员之间共享对象

问题描述

如何从多个actor向同一个对象读写数据?

文档说: https://docs.ray.io/en/master/memory-management.html

import numpy as np
a = ray.put(np.zeros(1))
b = ray.get(a)

但这会产生新的副本。

解决方法

在 actor 之间使用全局变量(您可以读/写)的正确方法是使用一个持有对象的 actor。 https://docs.google.com/document/d/167rnnDFIVRhHhK4mznEIemOtj63IOhtIPvSYaPgI4Fg/edit#heading=h.eg7m6lz2y48u

Plasma 对象是不可变的,您只能在将它们复制到 worker 的堆内存后才能修改该对象(这意味着它在那时不再是全局的)。

另请注意,对于您的示例,它不会创建新副本!它使用一种叫做零拷贝读取 (https://www.python.org/dev/peps/pep-0574/) 的东西,这意味着只复制带内数据(numpy 对象的元数据),而带外数据(缓冲区)不会复制到你的 python 的堆内存中(它驻留在共享内存中,你的射线程序直接指向那个内存区域)。