#python #parallel-processing #ray
#python #параллельная обработка #ray
Вопрос:
В настоящее время я пытаюсь распараллелить некоторые части Python
кода с помощью ray
модуля. К сожалению, 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))
Если я опущу np.copy()
in в функции mod_arr()
и попытаюсь изменить arr
вместо этого, я получаю следующую ошибку
ValueError: output array is read-only
Я использую ray
совершенно неправильно, или это неправильный инструмент для моей цели?
Ответ №1:
Из-за GIL в Python несколько потоков не могут выполняться параллельно на Python. Поэтому весь истинный параллелизм достигается либо за пределами Python, когда модуль выпускает GIL, либо с помощью многопроцессорной обработки.
При многопроцессорной обработке эта копия памяти является обычным процессом. Не только там, но и на самом деле в чистом функциональном программировании, где аргументы функций неизменяемы, решение состоит в том, чтобы всегда копировать память, когда это необходимо. Он имеет много преимуществ в стабильности, при этом платя приемлемое снижение производительности.
По сути, рассматривайте эти функции как чистые функции.
Комментарии:
1. Спасибо за понимание, звучит разумно (но что вы на самом деле имеете в виду, говоря «рассматривать эти функции как чистые функции» ?)
2. en.wikipedia.org/wiki/Pure_function Обратите больше внимания на то, что у них нет побочных эффектов — они нигде не изменяют никаких данных. Они только создают данные.