Я определяю learner
и worker
.Мне бы хотелось, чтобы learner
выполнял свою функцию-член learn
в фоновом режиме, и время от времени worker
отправляет learner
некоторую информацию для печати.
Следующий код является примером
import ray
@ray.remote
class Learner():
def __init__(self):
pass
def learn(self):
while True:
pass # do something, such as updating network
def log_score(self, score):
print('worker', score)
@ray.remote
class Worker():
def __init__(self, learner):
self.learner = learner
def sample(self):
for i in range(1000000):
if i % 1000 == 0:
self.learner.log_score.remote(i)
ray.init()
learner = Learner.remote()
worker = Worker.remote(learner)
worker.sample.remote()
learner.learn.remote()
while True:
pass
Однако learner
не будет запускаться log_score
до тех пор, пока не завершится learn
, а это не то, что я хочу.Я подумал о том, как заставить это работать: вместо явного вызова Learner.learn
у меня есть Worker
.В частности, я переопределяю learn
и sample
следующим образом
"""Learner"""
def learn(self):
# no loop here
pass # do something, such as updating network
"""Worker"""
def sample(self):
for i in range(1000000):
if i % 1000 == 0:
self.learner.learn.remote()
self.learner.log_score.remote(i)
Хотя это работает, но теперь я должен контролировать, как часто следует вызывать learn
, что выглядит отчасти избыточно.Есть ли способ лучше достичь того, чего я хочу?