У меня есть функция, которая загружает данные и циклически повторяет время, например.
def calculate_profit(account):
account_data = load(account) #very expensive operation
for day in account_data.days:
print(account_data.get(day).profit)
Поскольку загрузка данных стоит дорого, имеет смысл использовать joblib/multiprocessing, чтобы сделать что-то вроде этого:
arr = [account1, account2, account3, ...]
joblib.Parallel(n_jobs=-1)(delayed(calculate_profit)(arr))
Однако у меня есть еще одна дорогостоящая функция, которую я хотел бы применить к промежуточным результатам функции calculate_profit
. Например, предположим, что суммировать всю прибыль и обрабатывать ее/размещать на веб-сайте/и т. д. – затратная операция. Также мне нужна прибыль предыдущего дня, чтобы рассчитать изменение прибыли в этой функции.
def expensive_sum(prev_day_profits, *account_profits):
total_profit_today = sum(account_profits)
profit_difference = total_profit_today - prev_day_profits
#some other expensive operation
#more expensive operations
Так что я хотел бы
- Запускайте многопроцессорные процессы параллельно (чтобы уменьшить нагрузку на загрузку всех дорогостоящих данных учетной записи)
- Как только каждый многопроцессорный процесс достигает предопределенной точки (например, завершает одну итерацию цикла), возвращайте эти промежуточные значения другой функции (
expensive_sum
) для обработки — предположим, что каждый отдельный многопроцессорный процесс не может продолжаться доexpensive_sum
возвращается - ОДНАКО, я хочу поддерживать многопроцессорные процессы, чтобы мне не приходилось их повторно инициализировать (уменьшая эти накладные расходы)
Есть какой-либо способ сделать это?
load()
, так и дляexpensive_sum()
? Потому что, если вы собираетесь передавать большие объемы данных, вы можете потерять любое преимущество, которое вы получите от многопроцессорной обработки, из-за балета травления / распаковки, который Python делает при обмене данными между процессами. - person zwer   schedule 19.07.2017put
значения.... очередь не возвращает - person vks   schedule 19.07.2017