Обмен данными между процессами в Python - PullRequest
6 голосов
/ 10 августа 2010

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

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

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

1 Ответ

8 голосов
/ 10 августа 2010

Как лучше всего распределить структуру данных между процессами?

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

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

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

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

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

...