





Вы можете прочитать о многопоточности в Python и о многопоточности в целом.
Многопоточность в Python: http://www.devshed.com/c/a/Python/Basic-Threading-in-Python/
Если я правильно понимаю, в Python есть нечто, называемое GIL (Global Interpreter Lock), которое фактически делает невозможным использование многоядерных процессоров при выполнении нескольких потоков в Python.
См., Например, запись в блоге Гвидо ван Россума по этой теме. Насколько мне известно, из «основных» языков только C / C++ и Java имеют эффективную поддержку многоядерных процессоров.
Однако Jython медленнее CPython. IronPython работает так же быстро.
@ 1800 ИНФОРМАЦИЯ нет! только пользователи / разработчики Windows используют его МНОГОЕ, но это не относится к C / C++ и Java. период
@ Марти, ну, тогда я не понимаю, что ты имеешь в виду под мейнстримом, но он очень популярен
Основное различие заключается в том, как вы организуете и распределяете данные. Многоядерность обычно имеет более высокую пропускную способность между различными ядрами в процессоре, и многопроцессор должен больше задействовать шину между процессорами.
Python 2.6 получил многопроцессорность (процесс, как в запущенной программе) и больше объектов синхронизации и связи для многопоточного программирования.
Как упоминалось в другом сообщении, Python 2.6 имеет модуль многопроцессорность, который может использовать преимущества нескольких ядер / процессоров (он обходит GIL, прозрачно запуская несколько процессов). Он предлагает некоторые примитивы, похожие на модуль потоковой передачи. Вы найдете несколько (простых) примеров использования на страницах документации.
Подобные ответы удивительны, поскольку процессы не имеют общих адресных пространств, что приводит к существенно иной модели программирования.
Здесь есть небольшая и четко объясненная инструкция pythonprogramming.net/threading-tutorial-python
Нет такого понятия, как «многопроцессорное» или «многоядерное» программирование. Различие между «многопроцессорным» и «многоядерным» компьютеры, вероятно, не имеет отношения к вам как программисту приложений; это связано с тонкостями того, как ядра разделяют доступ к памяти.
Чтобы воспользоваться преимуществами многоядерного (или многопроцессорного) компьютера, вам нужна программа, написанная таким образом, чтобы ее можно было запускать параллельно, и среда выполнения, которая позволит программе фактически выполняться параллельно на нескольких ядрах (и операционной системы, хотя любая операционная система, которую вы можете запустить на своем ПК, сделает это). Это действительно параллельно программирование, хотя есть разные подходы к параллельному программированию. Те, которые имеют отношение к Python, - это многопроцессорность и многопоточность.
В таких языках, как C, C++, Java и C#, вы можете писать параллельные программы, выполняя несколько потоков. Глобальная блокировка интерпретатора в средах выполнения CPython и PyPy исключает эту опцию; но только для этих сред. (По моему личному мнению, многопоточность - это опасно и сложно, и, как правило, хорошо, что Python рекомендует вам не рассматривать это как способ получить преимущество в производительности.)
Если вы хотите написать параллельную программу, которая может работать на нескольких ядрах Python, у вас есть несколько разных вариантов:
threading и запустите ее в среде выполнения IronPython или Jython.processing (теперь включенный в Python 2.6 как модуль multiprocessing) для одновременного запуска вашего кода в нескольких процессах.subprocess для запуска нескольких интерпретаторов Python и связи между ними.Независимо от того, какой из этих вариантов вы выберете, вам нужно будет понять, как разделить работу, которую выполняет ваша программа, на части, которые имеет смысл разделить. Поскольку я не уверен, какие программы вы собираетесь писать, было бы сложно привести полезный пример.
В отличие от приложений, использующих несколько процессоров?
Это многопроцессорные приложения ... Не уверен, что понял суть. Я хотел сказать следующее: большинство людей понимают, что означают термины «многоядерное программирование» и «многопроцессорное программирование». Таким образом, вопрос ОП может быть переведен как «Можно ли писать программы, которые работают на нескольких ядрах / процессорах на python?» Условия, которые вы говорите, недействительны - ну, это так. Это все, что я хотел добавить.
Извините, но я не согласен с мнением вашей ветки. Правильное использование потоков требует некоторого размышления и соответствующего дизайна, но мы должны быть программистами, которые умеют думать и решать проблемы. Да, их можно использовать плохо, но то же самое относится почти ко всему, что мы делаем. Зачем игнорировать инструмент только потому, что для его использования нужно подумать? Несколько процессов - это не одно и то же. Есть накладные расходы на установку / удаление, потраченная впустую память, накладные расходы на связь и удачи, если вы хотите использовать объект, который нельзя мариновать. Да, правильно, просто измените свое приложение с учетом ограничений.
Дело не в том, что многопоточность требует использования мысль; конечно, все программирование требует размышлений. Проблема с потоками в том, что они требуют постоянное осознание их присутствия в каждой строчке кода. Напротив, если вы программируете с передачей сообщений, вы можете забыть о внешних системах, пока ваша функция не будет выполнена и не пора получить следующее сообщение. Многопоточное программирование с разделяемым изменяемым состоянием вызывает постоянное ужасающее беспокойство программиста или постоянный поток невозможного для воспроизведения для пользователя.
Вы действительно можете писать программы, которые будут использовать несколько процессоров. Вы не можете сделать это с потоками из-за блокировки GIL, но вы можете сделать это с помощью другого процесса. Либо:
Потоки и python будут разделены на несколько ядер, но некоторые из этих ядер (все, кроме одного, если вы не выполните волшебство в C) будут просто ждать GIL. Вот почему до Python 3.2 потоки, связанные с процессором, лучше работают на одноядерных машинах, чем на многоядерных машинах.
Некоторые модули реализованы на C и выпустят GIL. Модуль zlib (также используемый модулем gzip) является одним из них. Вы можете использовать несколько ядер для распаковки или сжатия данных с помощью нескольких потоков в Python. Другие примеры существуют в стандартной библиотеке (библиотека регулярных выражений) и некоторых других сторонних библиотеках, таких как net-snmp среди прочих.
@WillPierce Это читается как «Это можно сделать, и очень хорошо, но только если вы не используете Python». Я могу написать модуль C для использования практически на любом языке. Это плюс для C, но лишь подчеркивает недостатки Python.
Если у вас нет Python 2.6 (чего нет, например, если вы используете Ubuntu Edgy или Intrepid), вы можете использовать версию многопроцессорной обработки Код Google перенесен обратно. Он является частью PyPI, что означает, что вы можете легко установить его с помощью EasyInstall (который является частью пакета python-setuptools в Ubuntu).
Глобальная блокировка интерпретатора также является проблемой только для CPython - Jython и IronPython используют потоковую систему своей среды выполнения соответственно.