Я заинтересован в изучении параллельного программирования, ориентируясь на уровень приложения / пользователя (не системное программирование). Я ищу современный язык программирования высокого уровня, который предоставляет интуитивные абстракции для написания параллельных приложений. Я хочу сосредоточиться на языках, которые повышают производительность и скрывают сложность параллельного программирования.
Чтобы привести некоторые примеры, я не считаю хорошим вариантом написания многопоточного кода на C, C ++ или Java, потому что ИМХО моя производительность снижается, а их модель программирования не интуитивна. С другой стороны, хорошими вариантами будут языки, которые повышают производительность и предлагают более интуитивные абстракции, такие как Python и модуль многопроцессорной обработки, Erlang, Clojure, Scala и т. Д.
Что бы вы посоветовали, основываясь на вашем опыте и почему?
РЕДАКТИРОВАТЬ: Спасибо всем за ваши интересные ответы. Трудно сделать вывод, фактически не пытаясь, так как есть много хороших кандидатов: Erlang, Clojure, Scala, Groovy и, возможно, Haskell. Я проголосовал за ответ с наиболее убедительными аргументами, но я попробую всех хороших кандидатов, прежде чем решить, какой из них выбрать :)
To give an example, I don't consider a good option writing multithreaded code in C, C++, or Java
, Зачем?On the other hand, Python and the multiprocessing module, Erlang, Clojure, Scala, etc. are some of my options.
Опять же почему? Расширьте свой вопрос, чтобы лучше определить, что вы на самом деле ищете.begin transaction
end transaction
и все внутри должно быть без тупиков и либо успешно, либо с ошибками в целом.Ответы:
Вам почти наверняка стоит взглянуть на Clojure - на мой взгляд, это лучший современный язык для многоядерного программирования, и он чрезвычайно продуктивен.
Ключевые атрибуты:
Некоторые мини-примеры кода с уклоном параллелизма:
В частности, стоит посмотреть одно или несколько из этих видео:
источник
Вы можете попробовать D. Он предлагает три модели. Я рекомендую либо первое, либо второе.
std.concurrency . Если вы используете этот модуль для всех ваших потребностей параллелизма, то сочетание языка и стандартной библиотеки обеспечивает изоляцию между потоками. Потоки в основном обмениваются сообщениями посредством передачи сообщений с ограниченной поддержкой общей памяти таким образом, чтобы обеспечить безопасность, прежде всего, и запретить низкоуровневые гонки данных. К сожалению, документация std.concurrency нуждается в улучшении, но модель описана в бесплатной главе книги Андрея Александреску «Язык программирования D».
std.parallelism . Этот модуль разработан специально для многоядерного параллелизма, а не общего параллелизма. ( Параллелизм и параллелизм - это не одно и то же, хотя параллелизм необходим для реализации параллелизма. ) Поскольку суть параллелизма - это производительность, std.parallelism не делает никаких гарантий изоляции, поскольку они затруднят написание эффективного параллельного кода. Однако он абстрагирует множество подверженных ошибкам низкоуровневых деталей, поэтому очень сложно обойтись, если вы распараллеливаете рабочие нагрузки, которые вы проверяли вручную, взаимно независимы.
core.thread - это низкоуровневая оболочка для API-интерфейсов потоков, специфичных для ОС. И std.concurrency, и std.parallelism используют его под капотом, но я бы порекомендовал использовать его только в том случае, если вы пишете собственную библиотеку параллелизма или находите какой-то нелепый угловой пример, который не может быть хорошо реализован ни в std.parallelism, ни в std. .concurrency. Никто не должен использовать что-то такого низкого уровня для повседневной работы.
источник
Erlang, безусловно, отличный вариант, но что-то более практичное может быть Go , новый язык Google.
Это не так далеко от других распространенных языков, поэтому его легко получить, если вы уже знаете другие «простые» языки. Многие сравнивают его с Python или даже Lua с точки зрения того, насколько «удобно» это программировать.
источник
Посмотрите на параллельное программирование Microsoft для .net. Это очень интуитивно понятно.
источник
И Эрланг, и Скала имеют параллелизм , основанный на актерах , который я нашел очень интуитивным и легким для изучения.
источник
Я узнаю о Haskell прямо сейчас, и чтение этой статьи убедило меня, что Haskell - хороший вариант для параллельного программирования. Поскольку он является чисто функциональным (система типов знает, выполняет ли функция какой-либо ввод, вывод или чтение / изменение глобального состояния), он может выполнять такие операции, как программная транзакционная память (очень хорошо описанная в вышеприведенном документе), которая ведет себя аналогично транзакциям. в базах данных - вы получаете кучу приятных вещей, таких как атомарность, с небольшим добавлением сахара. AFAIK, Нити Haskell тоже очень легкие. В дополнение к этим фактам, тот факт, что Haskell является чисто функциональным, позволяет даже простым задачам выполняться параллельно с чуть более чем одним ключевым словом (par). источник
источник
Язык Google GO имеет несколько интересных инструментов для параллелизма - это было бы еще одной забавной вещью, которую можно попробовать. Смотрите: http://golang.org/doc/effective_go.html#concurrency и читайте немного примеров.
источник
В следующей версии C # делает это еще проще, чем показано на диаграмме. Появились два новых ключевых слова Async и Await.
Async используется в качестве модификатора функции и говорит: «эта операция выполняет свою работу в другом потоке.
Await используется в функции Async, и именно здесь происходит волшебство. По сути, Await указывает компилятору запустить операцию после ключевого слова в отдельном потоке и дождаться результатов. Любой код после вызова await выполняется после операции.
ТАКЖЕ, операция синхронизируется с вызывающим потоком (поэтому, если вы выполняете асинхронную операцию в ответ на нажатие кнопки, вам не нужно вручную отправлять обратно в поток пользовательского интерфейса). Два маленьких ключевых слова, и вы получаете много возможностей параллелизма. Узнайте больше здесь
источник
Я все еще рекомендую C ++. Он более чем способен к необходимым абстракциям для написания приличного параллельного кода. Подавляющая вероятность состоит в том, что у вас просто плохая библиотека для выполнения работы, поскольку хорошие библиотеки для выполнения работы являются относительно новыми, и, действительно, знания для правильного использования C ++ не совсем обычны. TBB Intel существует всего несколько лет, а PPL от Microsoft поставляется только с прошлого года.
Если вы используете что-то вроде TBB или PPL, то параллельный код, на самом деле, писать не совсем тривиально , поскольку параллелизм никогда не бывает тривиальным, но далеко не трудным. Если вы напрямую используете потоки pthreads или Win32, то неудивительно, что вам это не нравится - вы практически пишете на ассемблере с такими функциями. Но с PPL, вы говорите о стандартных функциональных алгоритмах, которые распараллелены для вас, общих структурах данных для одновременного доступа, и подобных вещах.
источник
std::thread
(илиstd::tr1::thread
). На самом деле это очень хорошая абстракция, ИМО.boost::thread
это просто оболочка ОС с небольшим RAII. PPL и TBB - это реальные параллельные алгоритмы, контейнеры и т. Д.Здесь нужен плагин для Ada , так как в нем есть все абстракции высшего уровня для параллелизма и параллелизма. иначе известный как управление задачами . Кроме того, поскольку OP попросил интуитивно (субъективные критерии!), Я думаю, что можно оценить другой подход к java-центрированному миру.
источник
Я хотел бы предложить Groovy / Java / GPars, если вы можете быть на основе JVM, поскольку он учитывает участников, поток данных, обмен последовательными процессами (CSP), параллелизм данных, программную транзакционную память (STM), агенты, ... Дело в том, что там Существует много моделей параллелизма и параллелизма высокого уровня, каждая из которых имеет свои «сладкие точки». Вы не хотите использовать модель, которая не согласуется с решением проблемы, которую вы пытаетесь построить. Языки и фреймворки только с одной моделью вынуждают вас взламывать алгоритмы.
Конечно, меня могут считать предвзятым, так как я участвую в Groovy и GPars. С другой стороны, я работаю с CSP и Python, ср. Python-CSP.
Еще один момент заключается в том, что первоначальный вопрос касается обучения, а не написания производственной системы. Таким образом, комбинация Groovy / Java / GPars является хорошим способом обучения, даже если возможная производственная работа выполняется в C ++ с использованием чего-то вроде Just :: Thread Pro или TBB, а не на основе JVM.
(Некоторые вполне разумные URL-ссылки пришлось удалить из-за некоторой паники по поводу спама на хост-сайте.)
источник
Что насчет Clojure? Например, вы можете использовать Swing, но наслаждаетесь средствами параллельного программирования Clojure? Clojure имеет неплохую интеграцию с Java.
Кроме того, вы рассматривали Java 7 Fork / Join Framework ?
источник
Вы также можете посмотреть Groovy и библиотеку GPars . GPars BTW отчасти похож на .NET Parallel Extension, упомянутый в другом ответе, но гибкий синтаксис Groovys делает его читаемым лучше в некоторых обстоятельствах.
источник
Scala упоминалась несколько раз в вопросах и ответах, но я не видел ссылок на Akka, которая является актерской реализацией, которую можно использовать как с Scala, так и с Java.
источник
Я думаю, это зависит от того, что вы строите. Настольные приложения или сервер? Я слышал, что (но у меня нет личного опыта) node.js отлично подходит для параллельного программирования для серверов (как с точки зрения написания кода, так и с точки зрения производительности). Если бы я хотел написать новое серверное приложение, я бы, наверное, попробовал это. Не уверен насчет настольных приложений ... Я написал довольно много вещей на C #, и есть некоторые инструменты, которые красиво скрывают сложность, хотя в других случаях вам приходится иметь дело с этим в лоб.
источник
Я могу получить удар по голове, но вы читали главу 7 TAOUP ? Раздел, о котором я думаю, - это потоки и процессы. Я обнаружил, что концепция параллельной обработки заставляет большинство людей думать о потоках, но я никогда не видел случая, когда поток проще и быстрее использовать, чем порождать дочерний процесс.
Вы прорабатываете все детали обработки параллелизма умным парням, которые создали вашу ОС. Уже есть много способов коммуникации, и вам не нужно беспокоиться о блокировке общих ресурсов. По сути, потоки - это хак эффективности, который подпадает под правило оптимизации. Не оптимизируйте, если вы не проверяли по необходимости.
Найдите хорошую библиотеку подпроцессов, такую как envoy для python . Или вы можете просто написать несколько отдельных программ на C и написать еще одну «основную» программу для использования fork и pipe для порождения и взаимодействия с подпроцессами.
источник