.NET язык для параллельного программирования - PullRequest
7 голосов
/ 23 сентября 2010

Это может быть вопрос, который видели другие, но я пытаюсь найти язык, предназначенный для (или с языковой поддержкой) параллельного программирования, который может работать на платформе .net.

Я занимался разработкой сторон в erlang, чтобы почувствовать язык, и мне понравилось, как легко получить стабильную параллельную или даже распределенную систему.Это привело меня к scala, в которой также была отличная система, использующая актеров, однако scala.net, похоже, не имеет такой функциональности в настоящее время (конечно, это параллельная система против распределенной системы).Два языка .net, на которые я смотрел, - это Axum и F #.

Это единственный выбор, который у меня есть?Есть ли другие?И, если они являются единственным выбором, каковы преимущества / недостатки каждого?

Ответы [ 4 ]

6 голосов
/ 23 сентября 2010

Аксум - исследовательский проект. настоящий исследовательский проект, в котором только идеи из него будут реализованы в продуктах. (В отличие от F #, который был произведен в целом.) Я даже не уверен, что лицензия позволяет использовать его для разработки производственных приложений.

F # - прекрасный выбор.

Clojure также работает на CLI и также является хорошим выбором.

CLI-порт Scala в настоящее время находится в процессе воскрешения (фактически, при официальном финансировании со стороны Microsoft), и библиотеки Actor Scala (как встроенные, так и Akka) довольно хороши.

Относительно комментария @ wmeyer выше: у самой Scala нет никаких условий для распределенного программирования. (Как и Clojure.) Обе обычно полагаются на множество Java-фреймворков, которые существуют для этой цели, таких как Terracotta. Однако у Akka есть Remote Actors для распределенного программирования, и Akka в значительной степени совместим с API со встроенной библиотекой Scala Actor, которая обеспечивает плавный переход.

Эрланг был бы отчасти крут. Kresten Krab Thorup в настоящее время работает над Erjang, реализацией Erlang для JVM, и у него есть довольно впечатляющие результаты: при работе с HotSpot Erjang масштабируется сопоставимо с BEAM, иногда даже лучше. Например, в (не) известном бенчмарке процессов с 10000 процессами Erjang запускается лишь минимально медленнее, чем BEAM, но когда вы повторяете прогон несколько раз и запускается JIT, он обгоняет BEAM после примерно 3 прогонов (и что любопытно) , BEAM начинает замедляться после 4 запусков).

Я почти уверен, что вы могли бы создать "#rlang" на DLR и TPL, который одинаково хорошо работает.

3 голосов
/ 23 сентября 2010

Я сейчас использую F # для одновременного и распределенного программирования.Я думаю, что это работает очень хорошо.Типы объединения позволяют легко определять статически типизированные сообщения.Сериализация .NET слишком медленная для нас, но заменить ее с помощью нестандартного синтаксического анализатора и комбинаторов непарсера было легко, а производительность теперь достаточно хорошая.Асинхронные рабочие процессы и процессоры почтовых ящиков упрощают передачу сообщений.Вывод типа означает, что вся моя кодовая база крошечная и ее легко обслуживать.

2 голосов
/ 24 сентября 2010

Я думаю, что Йорг уже ответил на ваш вопрос об Аксуме (и я мало что знаю об этом), поэтому я просто добавлю пару вещей о F # - одна вещь, на которую стоит обратить внимание, это то, что F # на самом деле не параллельный язык. У него просто есть хорошие библиотеки для параллельной разработки. Наиболее заметные варианты:

  • Task Parallel Library и PLINQ , которые также доступны в C #, но могут выглядеть немного лучше в F #, особенно если вы используете неизменяемые типы данных. Есть несколько хороших примеров F # использования этих двух в Параллельном программировании с .NET , и я написал сообщение в блоге о версии F #.

  • Асинхронные рабочие процессы не по существу предназначены для параллельного программирования - они позволяют писать неблокирующий код в целом (что весьма полезно при параллельном программировании), и они позволяют писать вычисления, которые можно запускать и управлять ими. Вы можете использовать их для:

    • Основанный на задачах параллелизм (немного похожий на Task Parallel Library) с использованием StartChild метода
    • Параллельные вычисления данных с использованием Async.Parallel
      _
  • Агентное программирование с использованием типа MailboxProcessor из F # позволяет вам использовать параллелизм передачи сообщений, который очень похож на Erlang. Он основан на асинхронных рабочих процессах, что дает вам некоторые преимущества (например, ожидание сообщения неблокирует).

Таким образом, я думаю, что более важно выбрать правильную параллельную модель программирования для вашей задачи, чем язык , используемый для его кодирования - до тех пор, пока язык дает вам достаточно возможность кодировать модель программирования. В этом случае модель программирования формирует ваш разум больше, чем язык. Axum основан на модели актера (передачи сообщений), поэтому я думаю, что с некоторыми усилиями вы могли бы обернуть F # агенты, чтобы они выглядели очень похоже на Axum API.

0 голосов
/ 29 ноября 2012

Начиная с .NET 4.5 вы можете использовать C # async / await.Я попытался объяснить потокобезопасный дизайн на основе акторов , используя async / await. AsyncWcfLib предназначен для помощи при создании параллельных или распределенных систем.

...