мультипроцесс или распараллеливающий в Python?

Это довольно хорошее также: RegExr

32
задан Ryan 4 August 2009 в 09:47
поделиться

8 ответов

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

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

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

Stackless Python - тоже неплохая идея. Как указано выше, у Stackless есть проблемы с переносимостью. Пустая Ласточка была многообещающей, но теперь не существует. Pyston - еще одна (незаконченная) реализация Python, ориентированная на скорость. Он использует подход, отличный от PyPy, который может дать лучшее (или просто другое) ускорение.

30
ответ дан 27 November 2019 в 20:45
поделиться

Для небольших коллекций данных просто создайте подпроцессы с помощью subprocess.Popen .

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

Когда все подпроцессы завершены (или истекло время ожидания), вы просто объединяете выходные файлы.

Очень просто.

7
ответ дан 27 November 2019 в 20:45
поделиться

Вы можете изучить Stackless Python . Если у вас есть контроль над функцией, которая занимает много времени, вы можете просто добавить туда несколько stackless.schedule () (говоря о переходе к следующей сопрограмме), или вы можете установить Stackless для вытесняющей многозадачности .

В Stackless у вас нет потоков, но есть тасклеты или гринлеты , которые по сути являются очень легкими потоками. Он отлично работает в том смысле, что существует довольно хороший фреймворк с очень небольшими настройками для многозадачности.

Однако Stackless мешает переносимости, потому что вам нужно заменить несколько стандартных библиотек Python - Stackless устраняет зависимость от стека C. . Это очень удобно, если у следующего пользователя также установлен Stackless,

7
ответ дан 27 November 2019 в 20:45
поделиться

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

Более подробная информация доступна в , связанном с этим вопросом .

0
ответ дан 27 November 2019 в 20:45
поделиться

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

0
ответ дан 27 November 2019 в 20:45
поделиться

IronPython имеет настоящую многопоточность, в отличие от CPython и его GIL. Так что в зависимости от того, что вы делаете, возможно, стоит посмотреть. Но похоже, что ваш вариант использования лучше подходит для модуля многопроцессорности.

Для парня, который рекомендует бесстековый питон, я не эксперт в этом, но мне кажется, что он говорит о программной "многопоточности", которая на самом деле вообще не является параллельным (по-прежнему выполняется в одном физическом потоке, поэтому не может масштабироваться на несколько ядер). Это просто альтернативный способ структурировать асинхронное (но все же однопоточное, непараллельное) приложение.

0
ответ дан 27 November 2019 в 20:45
поделиться

задачи выполняются последовательно, но у вас есть иллюзия, которая работает параллельно. Задачи хороши, когда вы используете для файла или подключения ввода / вывода, а также из-за легких.

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

Установка Multipress Multipress может быть очень легко:

from multiprocessing import Pool

def worker(input_item):
    output = do_some_work()
    return output

pool = Pool() # it make one process for each CPU (or core) of your PC. Use "Pool(4)" to force to use 4 processes, for example.
list_of_results = pool.map(worker, input_list) # Launch all automatically
9
ответ дан 27 November 2019 в 20:45
поделиться

Вы можете посмотреть скрученный . Он предназначен для асинхронных сетевых задач.

0
ответ дан 27 November 2019 в 20:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: