Обмен данными между процессами в Python
У меня сложная структура данных (определяемый пользователем тип), по которой выполняется большое количество независимых вычислений. Структура данных в основном неизменна. Я говорю в основном, потому что, хотя интерфейс выглядит неизменным, внутри происходит какая-то ленивая оценка. Некоторые из лениво вычисляемых атрибутов хранятся в словарях (возвращаемые значения дорогостоящих функций по входному параметру). Я хотел бы использовать Pythons многопроцессорность модуль для распараллеливания проведенные расчеты. У меня на уме два вопроса.
- как мне лучше всего делиться структурой данных между процессами?
- есть ли способ справиться с проблемой ленивой оценки без использования блокировок (несколько процессов пишут одно и то же значение)?
заранее спасибо за любые ответы, комментарии или просветляющие вопросы!
1 ответов
как мне лучше всего делиться структурой данных между процессами?
трубопроводов.
origin.py | process1.py | process2.py | process3.py
Разбейте свою программу так, чтобы каждый расчет был отдельным процессом следующей формы.
def transform1( piece ):
Some transformation or calculation.
для тестирования, вы можете использовать его, как это.
def t1( iterable ):
for piece in iterable:
more_data = transform1( piece )
yield NewNamedTuple( piece, more_data )
для воспроизведения всего расчета в одном процессе, вы можете сделать это.
for x in t1( t2( t3( the_whole_structure ) ) ):
print( x )
вы можете обернуть каждое преобразование с небольшим количеством файлов ввода-вывода. Рассол хорошо работает для этого, но другие представления (например, JSON или YAML) тоже работают хорошо.
while True:
a_piece = pickle.load(sys.stdin)
more_data = transform1( a_piece )
pickle.dump( NewNamedTuple( piece, more_data ) )
каждый шаг обработки становится независимым процессом на уровне ОС. Они будут работать одновременно и будут-немедленно-потреблять все ресурсы уровня ОС.
есть ли способ справиться с проблемой ленивой оценки без использования блокировок (несколько процессов пишут одно и то же значение)?
трубопроводов.