Параллелизм в Python
каковы варианты достижения параллелизма в Python? Я хочу выполнить кучу вычислений, связанных с процессором, над некоторыми очень большими растрами и хотел бы их распараллелить. Исходя из фона C, я знаком с тремя подходами к параллелизму:
- процессы передачи сообщений, возможно, распределенные по кластеру, например MPI.
- явный параллелизм общей памяти, либо используя pthreads не или вызов Fork(), pipe (), et. Эл!--6-->
- неявный параллелизм общей памяти, используя OpenMP.
решение о подходе к использованию-это упражнение в компромиссах.
в Python, какие подходы имеются, и каковы их характеристики? Есть clusterable MPI клон? Каковы предпочтительные способы достижения параллелизма с общей памятью? Я слышал упоминание о проблемах с Гиль, а также ссылки на tasklets.
короче говоря, что мне нужно знать о различных стратегиях распараллеливания в Python, прежде чем выбирать между ними?
5 ответов
Как правило, вы описываете вычисление привязки CPU. Это не форте в Python. Ни исторически, является многопроцессорной.
Threading в основном интерпретаторе Python управляется страшной глобальной блокировкой. Новый многопроцессорность API работает вокруг этого и дает абстракцию рабочего пула с трубами и очередями и тому подобное.
вы можете написать свой критический код производительности в C или на Cython, и использовать Python для клей.
новый (2.6) многопроцессорность модуль-это путь. Он использует подпроцессы, которые обходят Гиль
есть много пакетов для этого, наиболее подходящим, как и другие, является многопроцессорная обработка, особенно с классом "пул".
аналогичный результат можно получить с помощью параллельный python, который дополнительно предназначен для работы с кластерами.
в любом случае, я бы сказал, пойти с многопроцессорной обработки.
в зависимости от того, сколько данных вам нужно обработать и сколько процессоров / машин вы собираетесь использовать, в некоторых случаях лучше написать часть его на C (или Java/C#, если вы хотите использовать jython/IronPython)
ускорение, которое вы можете получить от этого, может сделать больше для вашей производительности, чем параллельный запуск на 8 процессорах.