Поддерживает ли python многопроцессорное / многоядерное программирование? - PullRequest
69 голосов
/ 15 октября 2008

В чем разница между многопроцессорным программированием и многоядерным программированием? желательно показать примеры на python, как написать небольшую программу для многопрограммного и многоядерного программирования

Ответы [ 7 ]

96 голосов
/ 15 октября 2008

Не существует такого понятия, как «многопроцессорное» или «многоядерное» программирование. Различие между «многопроцессорным» и «многоядерным» компьютерами , вероятно, не имеет отношения к вам как к прикладному программисту; это связано с тонкостями того, как ядра разделяют доступ к памяти.

Чтобы воспользоваться преимуществами многоядерного (или многопроцессорного) компьютера, вам нужна программа, написанная таким образом, чтобы ее можно было запускать параллельно, и среда выполнения, которая позволит программе фактически выполняться параллельно на нескольких ядра (и операционная система, хотя любая операционная система, которую вы можете запустить на вашем ПК, сделает это). Это действительно параллельное программирование, хотя существуют разные подходы к параллельному программированию. Те, которые имеют отношение к Python, являются многопроцессорными и многопоточными.

В таких языках, как C, C ++, Java и C #, вы можете писать параллельные программы, выполняя несколько потоков. Глобальная блокировка интерпретатора в средах выполнения CPython и PyPy исключает эту опцию; но только для тех времен выполнения. (По моему личному мнению, многопоточность опасна и хитра , и, как правило, хорошо, что Python рекомендует вам не рассматривать это как способ получить преимущество в производительности.)

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

  • Напишите многопоточную программу, используя модуль threading, и запустите ее во время выполнения IronPython или Jython.
  • Используйте модуль processing (теперь включен в Python 2.6 как модуль multiprocessing), чтобы запускать код в нескольких процессах одновременно.
  • Используйте модуль subprocess для запуска нескольких интерпретаторов Python и обмена данными между ними.
  • Используйте Витой и Ампулу . Это дает преимущество не только в том, что ваш код выполняется в разных процессах, но и (если вы не предоставляете доступ к таким вещам, как файлы), возможно, на разных компьютерах.

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

24 голосов
/ 15 октября 2008

Как упоминалось в другом посте, Python 2.6 имеет модуль multiprocessing , который может использовать преимущества нескольких ядер / процессоров (он обходит GIL, прозрачно запуская несколько процессов). Он предлагает несколько примитивов, похожих на модуль потоков. Вы найдете несколько (простых) примеров использования на страницах документации.

5 голосов
/ 15 октября 2008

На самом деле вы можете писать программы, которые будут использовать несколько процессоров. Вы не можете сделать это с потоками из-за блокировки GIL, но вы можете сделать это с другим процессом. Или:

2 голосов
/ 15 октября 2008

Если я правильно понимаю, в Python есть нечто, называемое GIL (Global Interpreter Lock), которое фактически делает невозможным использование преимуществ многоядер при выполнении нескольких потоков в Python.

См., Например, запись в блоге Гвидо ван Россума на эту тему. Насколько я знаю, среди "основных" языков только C / C ++ и Java имеют эффективную поддержку многоядерных процессоров.

2 голосов
/ 15 октября 2008

Вы можете прочитать о многопоточности в python и потоке в целом

Многопоточность в Python: http://www.devshed.com/c/a/Python/Basic-Threading-in-Python/

1 голос
/ 15 октября 2008

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

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

0 голосов
/ 13 февраля 2009

Если у вас нет Python 2.6 (чего нет у вас, например, если вы используете Ubuntu Edgy или Intrepid), вы можете использовать код Google с обратной связью версию многопроцессорной обработки. Он является частью PyPI, что означает, что вы можете легко установить его с помощью EasyInstall (который входит в пакет python-setuptools в Ubuntu).

...