Допустим, у меня есть класс с именем List
, экземпляр которого имеет атрибут list_
, содержащий список чисел. Теперь я готов удвоить каждое число в списке, применяя метод double_value_via_index
.
. На мой взгляд, эту задачу можно распараллелить, поскольку числа в списке не имеют ничего общего. Но кажется невозможным изменить self.list_
, пока идет распараллеливание. Поэтому я предложил другой подход, при котором удвоенные значения будут возвращаться и присваиваться self.list_
через self.list_ = doubled_numbers
.
Однако я все еще хочу знать, могут ли атрибуты экземпляра быть изменены в процессе распараллеливания или нет .
Любая помощь будет оценена. Заранее спасибо.
Код моего примера показан ниже.
import ray
class List:
def __init__(self, list_):
self.list_ = list_
# attempt 1
@ray.remote
def double_value_via_index(self, index):
self.list_[index] *= 2
return None
def double_all_values(self):
ray.init()
self_id = ray.put(self)
results_id = [List.double_value_via_index.remote(self_id, index)
for index in range(len(self.list_))]
results = ray.get(results_id)
ray.shutdown()
return None
# attempt 2
@ray.remote
def get_double_value_of_index(self, index):
return self.list_[index] * 2
def double_all_values_sol2(self):
ray.init()
self_id = ray.put(self)
results_id = [List.get_double_value_of_index.remote(self_id, index)
for index in range(len(self.list_))]
doubled_numbers = ray.get(results_id)
self.list_ = doubled_numbers
ray.shutdown()
return None
foo = List([1, 2, 3, 4])
foo.double_all_values()
print(f'Doubled values {foo.list_}') # [1, 2, 3, 4]
bar = List([1, 2, 3, 4])
bar.double_all_values_sol2()
print(f'Doubled values {bar.list_}') # [2, 4, 6, 8]