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

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
69
0
69 122
7

Ответы 7

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

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

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

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

Глобальная блокировка интерпретатора также является проблемой только для CPython - Jython и IronPython используют потоковую систему своей среды выполнения соответственно.

VolkA 15.10.2008 14:31

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

Blaisorblade 25.02.2011 22:25

@ 1800 ИНФОРМАЦИЯ нет! только пользователи / разработчики Windows используют его МНОГОЕ, но это не относится к C / C++ и Java. период

All Іѕ Vаиітy 19.02.2016 01:43

@ Марти, ну, тогда я не понимаю, что ты имеешь в виду под мейнстримом, но он очень популярен

1800 INFORMATION 21.02.2016 23:31

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

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

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

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

Alex Kreimer 24.05.2014 21:42

Здесь есть небольшая и четко объясненная инструкция pythonprogramming.net/threading-tutorial-python

Chris McCowan 26.09.2019 18:29

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

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

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

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

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

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

Нет такого понятия, как «многопроцессорное» или «многоядерное» программирование. - sure there is. Многоядерный programming is writing applications that take advantage of multiple cores.
johndodo 26.01.2012 13:12

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

Glyph 26.01.2012 13:41

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

johndodo 26.01.2012 16:05

Извините, но я не согласен с мнением вашей ветки. Правильное использование потоков требует некоторого размышления и соответствующего дизайна, но мы должны быть программистами, которые умеют думать и решать проблемы. Да, их можно использовать плохо, но то же самое относится почти ко всему, что мы делаем. Зачем игнорировать инструмент только потому, что для его использования нужно подумать? Несколько процессов - это не одно и то же. Есть накладные расходы на установку / удаление, потраченная впустую память, накладные расходы на связь и удачи, если вы хотите использовать объект, который нельзя мариновать. Да, правильно, просто измените свое приложение с учетом ограничений.

Basic 07.01.2014 21:31

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

Glyph 09.01.2014 01:22
Как правило, хорошо, что Python рекомендует вам не рассматривать многопоточность как способ получить преимущество в производительности.. What about load sharing? Would this not increase performance? It is my opinion that if there is processing power in the machine you should use it and not wait "in case other apps may need it". It is much better to split things up in smaller jobs to use the capacity. This will save money in terms of saving on hardware. If python cannot handle this it might be preferred to build something in another language which can be used to run single thread python tasks.
patrik 04.10.2017 23:42

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

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

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

Chad 03.07.2011 00:26

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

Will Pierce 04.12.2013 05:45

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

Basic 07.01.2014 21:34

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

Другие вопросы по теме