Обмен данными между процессами в Python

У меня сложная структура данных (определяемый пользователем тип), по которой выполняется большое количество независимых вычислений. Структура данных в основном неизменна. Я говорю в основном, потому что, хотя интерфейс выглядит неизменным, внутри происходит какая-то ленивая оценка. Некоторые из лениво вычисляемых атрибутов хранятся в словарях (возвращаемые значения дорогостоящих функций по входному параметру). Я хотел бы использовать Pythons многопроцессорность модуль для распараллеливания проведенные расчеты. У меня на уме два вопроса.

  1. как мне лучше всего делиться структурой данных между процессами?
  2. есть ли способ справиться с проблемой ленивой оценки без использования блокировок (несколько процессов пишут одно и то же значение)?

заранее спасибо за любые ответы, комментарии или просветляющие вопросы!

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 ) )

каждый шаг обработки становится независимым процессом на уровне ОС. Они будут работать одновременно и будут-немедленно-потреблять все ресурсы уровня ОС.

есть ли способ справиться с проблемой ленивой оценки без использования блокировок (несколько процессов пишут одно и то же значение)?

трубопроводов.