Поддерживает ли python многопроцессорное/многоядерное программирование?

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

Ответ 1

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

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

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

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

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

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

Ответ 2

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

Ответ 3

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

  • используйте модуль subprocess и разделите свой код на выполнение процесса на процессор
  • посмотрите parallelpython модуль
  • Если вы используете python > 2.6, посмотрите на модуль multiprocess.

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

Ответ 8

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

Такие вещи, как Psyco, нет, но у Psyco есть некоторые ошибки и не ускоряет весь код. И все же они не поддерживают многопоточность.

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