У меня есть программа обработки данных, написанная на Python, которая должна вызывать внешнюю программу в течение одного этапа. Профилирование показывает, что около 50% общего времени обработки затрачивается на эту одну стадию.
У меня есть компьютер с несколькими ядрами, поэтому параллелизм кажется решением. Проблема в том, что звонок запоминается:
def one_stage_of_processing(long_list_of_inputs, cache={}):
outputs = []
for input in list_of_inputs:
outputs.append(expensive_external_processing(input, cache))
return outputs
def expensive_external_processing(input, cache):
if input not in cache:
cache[input] = subprocess.run(...).stdout
return cache[input]
И опыт работы с Си заставляет меня опасаться условий гонки, повреждающих кеш.
Какой самый лучший, самый Pythonic способ распараллелить этот этап обработки? Я хотел бы сохранить памятку на месте, потому что ее удаление увеличивает время выполнения в четыре раза.