Параллелизм в Python

каковы варианты достижения параллелизма в Python? Я хочу выполнить кучу вычислений, связанных с процессором, над некоторыми очень большими растрами и хотел бы их распараллелить. Исходя из фона C, я знаком с тремя подходами к параллелизму:

  1. процессы передачи сообщений, возможно, распределенные по кластеру, например MPI.
  2. явный параллелизм общей памяти, либо используя pthreads не или вызов Fork(), pipe (), et. Эл!--6-->
  3. неявный параллелизм общей памяти, используя OpenMP.

решение о подходе к использованию-это упражнение в компромиссах.

в Python, какие подходы имеются, и каковы их характеристики? Есть clusterable MPI клон? Каковы предпочтительные способы достижения параллелизма с общей памятью? Я слышал упоминание о проблемах с Гиль, а также ссылки на tasklets.

короче говоря, что мне нужно знать о различных стратегиях распараллеливания в Python, прежде чем выбирать между ними?

5 ответов


Как правило, вы описываете вычисление привязки CPU. Это не форте в Python. Ни исторически, является многопроцессорной.

Threading в основном интерпретаторе Python управляется страшной глобальной блокировкой. Новый многопроцессорность API работает вокруг этого и дает абстракцию рабочего пула с трубами и очередями и тому подобное.

вы можете написать свой критический код производительности в C или на Cython, и использовать Python для клей.


новый (2.6) многопроцессорность модуль-это путь. Он использует подпроцессы, которые обходят Гиль


вас может заинтересовать Stackless Python.


есть много пакетов для этого, наиболее подходящим, как и другие, является многопроцессорная обработка, особенно с классом "пул".

аналогичный результат можно получить с помощью параллельный python, который дополнительно предназначен для работы с кластерами.

в любом случае, я бы сказал, пойти с многопроцессорной обработки.


в зависимости от того, сколько данных вам нужно обработать и сколько процессоров / машин вы собираетесь использовать, в некоторых случаях лучше написать часть его на C (или Java/C#, если вы хотите использовать jython/IronPython)

ускорение, которое вы можете получить от этого, может сделать больше для вашей производительности, чем параллельный запуск на 8 процессорах.