"Pythonic" многопоточный (Concurrent) язык - PullRequest
3 голосов
/ 12 октября 2010

Сейчас я в основном пишу на python, однако я ищу язык, который более дружествен к потокам (не JAVA, C #, C или C ++).

Потоки Python хороши, когда они связаны с вводом-выводом, но они заканчиваются, когда я делаю что-то интенсивное использование процессора.

Есть идеи?

Спасибо, Джеймс

Ответы [ 8 ]

7 голосов
/ 12 октября 2010

Clojure довольно забавно, если вы увлекаетесь такими вещами.Это шутка, которая работает на JVM.По-видимому, это так же быстро, как Java для многих вещей, несмотря на то, что он динамически набирается *.Взаимодействие с Java примерно настолько удобно, насколько я могу себе представить, хотя нативные библиотеки clojure уже достаточно приличны, чтобы вам не нужно было запускать Java для большинства вещей.как карты (-> Python dicts) и векторы (-> списки Python), чтобы уменьшить вероятность возникновения пароксизма в скобках.

Да, параллелизм.Он использует программную систему транзакционной памяти, которая сама по себе довольно интересна. Дополнительно, дополнительно: прочитайте все об этом .

*: я думаю, что вам может понадобиться использовать "подсказку типа", чтобы получить Java-подобную скорость для многих задач.Это сделано довольно удобно в Clojure.

4 голосов
/ 12 октября 2010

Прежде всего, какую проблему программирования вы пытаетесь решить?GIL действительно стал узким местом еще?(Если вы не уверены, вероятно, нет.)

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

ЕслиВы действительно, действительно знаете, что GIL стал узким местом, и что вам нужно разбивать числа между несколькими процессорами, тогда вы должны подумать:

  1. Если вы знаете разделы, критичные для ЦП, скомпилируйте ихс объявлениями типа C, используя Pyrex / Cython , если можете.Это, во-первых, сделает их намного более эффективными для ЦП, чем интерпретация байт-кода Python, и, в качестве бонуса, позволит вам выпускать GIL вокруг разделов, которые в этом не нуждаются.(Мораль: превратите своих ослов в скаковых лошадей, прежде чем пытаться их распараллелить.)
  2. Само собой разумеется, но если вы используете какие-либо модули расширения, интенсивно использующие процессор, убедитесь, что они еще не выпускают GILдля вас.
  3. Почти для всего остального используйте встроенный модуль multiprocessing.Это дает вам примерно тот же API и преимущества, что и threading, но обеспечивает истинный параллелизм на уровне процесса : среди прочего, это позволяет вам легко запускать код, интенсивно использующий процессор, на нескольких компьютерах в комплексе, что очень важно, если ваша проблема действительно становится большой.
3 голосов
/ 12 октября 2010
Синтаксис

boo основан на Python.Тем не менее, язык программирования немного отличается: он строго типизирован с выводом типов, и его наиболее важной особенностью, вероятно, является конвейер открытого компилятора, то есть способность создавать синтаксические макросы (в смысле LISP слова «макрос», а нев смысле «макрос препроцессора»).

И, очевидно, IronPyton довольно питоничен и примерно так же хорош в многопоточности, как и другие языки .NET.

2 голосов
/ 12 октября 2010

Stackless Python может использоваться EVE online разработчиками.

Stackless Python - расширенная версияЯзык программирования Python.Это позволяет программистам воспользоваться преимуществами программирования на основе потоков без проблем с производительностью и сложностью, связанных с традиционными потоками.Микропотоки, которые Stackless добавляет в Python, - это дешевое и легкое удобство, которое при правильном использовании может не только служить способом структурирования приложения или инфраструктуры, но и улучшать структуру программы и облегчать чтение кода.

1 голос
/ 12 октября 2010

Вы можете просто использовать python multiprocessing , он отражает API потоков, но запускает отдельные процессы.Не может быть реализовано для не-posix.Для общих проблем с интенсивным использованием процессора вы всегда можете попробовать Stackless Python (уже упоминалось) или Pyrex .

1 голос
/ 12 октября 2010

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

Вместо того, чтобы ловить рыбу случайно для других языков, сделайте это.

  1. Разложите проблему в последовательность шагов, которые можно выполнить одновременно.

    В оболочке скрипт верхнего уровня выглядит так: a.py | b.py | c.py | d.py ...

  2. Запись каждого шага в виде очень маленького цикла Python, который читает из sys.stdin и записывает в sys.stdout. Интересно, что по умолчанию raw_input() и print() упрощают задачу.

  3. Измерение производительности.

Вы - правильно - потратите все свое время на разработку своего алгоритма. Вы потратите немного времени на программирование или изучение нового языка. Вы будете тривиально связывать каждое ядро ​​на каждом доступном вам процессоре. Вы не будете тратить время на синхронизацию потоков или другую глупость.

Подобные вещи работают очень и очень хорошо для приложений "CPU Intensive".

1 голос
/ 12 октября 2010

Python терпит неудачу, когда дело доходит до задач с интенсивным использованием процессора, потому что Python не очень эффективный язык. Многие "динамические" языки имеют эту проблему, поскольку компилятор ограничен в том, что он может предположить о программе во время компиляции. Например, вызовы методов, возможно, придется искать каждый раз в случае, если кто-то заменил метод в объекте между каждым вызовом.

Я бы порекомендовал вам взглянуть на Erlang , хотя, вероятно, это не "Pythonic" в вашем понимании этого слова. : -)

1 голос
/ 12 октября 2010

чтобы преодолеть GIL, вы можете попробовать интерпретировать язык Python с помощью jython вместо cpython

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...