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

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

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

Заранее благодарим за любые ответы, комментарии или интересные вопросы!

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 )

Вы можете обернуть каждое преобразование небольшим количеством файлов ввода/вывода. Pickle хорошо работает для этого, но другие представления (например, JSON или YAML) тоже работают хорошо.

while True:
 a_piece = pickle.load(sys.stdin)
 more_data = transform1( a_piece )
 pickle.dump( NewNamedTuple( piece, more_data ) )

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

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

Трубопроводы.

licensed under cc by-sa 3.0 with attribution.