Следующий код взят из https://bair.berkeley.edu/blog/2018/01/09/ray/.
import gym
@ray.remote
class Simulator(object):
def __init__(self):
self.env = gym.make("Pong-v0")
self.env.reset()
def step(self, action):
return self.env.step(action)
# Create a simulator, this will start a remote process that will run
# all methods for this actor.
simulator = Simulator.remote()
observations = []
for _ in range(4):
# Take action 0 in the simulator. This call does not block and
# it returns a future.
observations.append(simulator.step.remote(0))
Я чувствую себя очень смущенным, когда я читаю этот код. Этот код действительно работает параллельно? Исходя из моего понимания, существует только один env
, поэтому приведенный выше код должен выполнять действия в последовательном порядке, т.е. действия выполняются одно за другим. Если это так, то какой смысл делать что-то подобное вышеописанному?
Вы правы, есть один актер Simulator
. Метод step
вызывается у актера четыре раза. Это создает четыре задачи, которые актер будет выполнять последовательно.
Если это все, что делает приложение, то нет смысла создавать обычный объект Python и вызывать метод четыре раза. Тем не менее, этот подход дает вам возможность создать двух акторов Simulator
и вызывать методы для них параллельно. Например, вы можете написать следующее.
# This assumes you've already called "import ray", "import gym",
# "ray.init()", and defined the Simulator class from the original
# post.
# Create two simulators.
simulator1 = Simulator.remote()
simulator2 = Simulator.remote()
# Step each of them four times.
observation_ids1 = []
observation_ids2 = []
for _ in range(4):
observation_ids1.append(simulator1.step.remote(0))
observation_ids2.append(simulator2.step.remote(0))
# Get the results.
observations1 = ray.get(observation_ids1)
observations2 = ray.get(observation_ids2)
В этом примере каждый симулятор выполняет четыре задачи последовательно, но два симулятора работают параллельно. Вы можете проиллюстрировать это, поместив оператор time.sleep(1)
в метод step
и time.sleep(1)
время, необходимое для выполнения общего вычисления.