2008-10-15 3 views
64

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

ответ

2

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

См., Например, Guido van Rossum's blog entry по теме. Насколько я знаю, среди «основных» языков только C/C++ и Java имеют эффективную поддержку для мультикодов.

+1

C# не является основным? –

+1

Global Interpreter Lock также является только проблемой CPython - Jython и IronPython используют систему потоковой передачи их времени выполнения, соответственно. – VolkA

+0

Однако Jython работает медленнее, чем CPython. IronPython так же быстро. – Blaisorblade

1

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

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

24

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

+0

Эти ответы удивительны, поскольку процессы не разделяют их адресные пространства, что приводит к существенно иной модели программирования. –

89

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

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

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

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

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

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

+3

* Нет такого понятия, как «многопроцессорное» или «многоядерное» программирование * - конечно, есть. * Программирование Multicore * - это приложение, использующее несколько ядер. – johndodo

+1

В отличие от приложений, которые используют преимущества нескольких процессоров? – Glyph

+7

Это многопроцессорные приложения ... Не уверен, что я получил точку. Я хотел сказать следующее: большинство людей понимают, что означают термины «многоядерное программирование» и «многопроцессорное программирование».Поэтому вопрос OP можно перевести на «Можно ли писать программы, которые работают на нескольких ядрах/процессорах в python?» Термины, которые вы говорите, недействительны - ну, они есть. Это все, что я хотел добавить. – johndodo

5

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

  • Используйте subprocess модуль, и разделить код для выполнения процесса на процессор
  • посмотреть на parallelpython модуль
  • если вы используете Python> 2.6 взглянуть на multiprocess модуля.
+1

Темы и python будут разделены на несколько ядер, но некоторые из этих ядер (все, кроме одного, если вы не делаете какую-либо магию на C), просто будут ждать GIL. Именно поэтому перед Python 3.2 потоки, связанные с процессором, работают лучше на одноядерных, чем многоядерные. – Chad

+1

Некоторые модули реализованы на C и выпустят GIL. Одним из них является модуль zlib (также используемый модулем gzip). Вы можете использовать несколько ядер для распаковки или сжатия данных с использованием нескольких потоков в python. Другие примеры существуют в стандартной библиотеке (библиотека регулярных выражений) и некоторых других сторонних библиотеках, таких как net-snmp среди других. –

+0

@WillPierce Это выглядит так: «Это можно сделать и очень хорошо, но только если вы не используете Python». Я могу написать модуль C для использования практически на любом языке. Это плюс для C, но просто подчеркивает недостатки Python. – Basic

-2

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

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

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

+0

Кто-нибудь хочет объяснить его downvotes? – Blaisorblade

+9

Я не спустил вас вниз. Но нет абсолютно никаких оснований отказаться от Python. 95% кода, который кто-либо пишет, должны быть оптимизированы для удобства чтения, а не для низкоуровневой производительности. Для остальных 5% производительность имеет огромное значение. Я буду придерживаться C для этого, спасибо, Java не будет достаточно быстрым. С помощью правильных инструментов расширение Python C может быть очень читаемым и простым. (И с неправильными инструментами он будет даже менее читабельным, чем без инструментов). Я могу только сделать вывод, что вы никогда не пытались. – maxy

+1

Я не писал расширения Python C, у меня просто достаточно опыта программирования на C, чтобы знать, насколько сложнее, чем Python. Кроме того, расширения C были лишь побочным моментом. – Blaisorblade

0

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

Смежные вопросы