Какие библиотеки существуют для других языков программирования, чтобы обеспечить модель параллелизма в стиле Erlang (процессы, почтовые ящики, получение с сопоставлением с образцом и т. д.)?
Примечание. Меня особенно интересуют вещи, которые должны быть похожи на Erlang, а не просто библиотеки потоков или очередей.





Microsoft Параллелизм и координация времени выполнения для .NET.
The CCR is appropriate for an application model that separates components into pieces that can interact only through messages. Components in this model need means to coordinate between messages, deal with complex failure scenarios, and effectively deal with asynchronous programming.
Scala поддерживает актеров. Но я бы не назвал scala намеренно похожим на Erlang.
Тем не менее, на scala стоит взглянуть!
Также килим - это библиотека для java, которая переносит передачу сообщений / актеров в стиле erlang на язык Java.
Интерфейс передачи сообщений (MPI) (http://www-unix.mcs.anl.gov/mpi/) - это хорошо масштабируемая и надежная библиотека для параллельного программирования, изначально ориентированная на C, но теперь доступная в нескольких вариантах http://en.wikipedia.org/wiki/Message_Passing_Interface#Implementations. Хотя библиотека не вводит новый синтаксис, она предоставляет протокол связи для организации совместного использования данных между подпрограммами, которые можно распараллеливать.
Традиционно она используется в больших кластерных вычислениях, а не в одной системе для параллелизма, хотя многоядерные системы, безусловно, могут использовать преимущества этой библиотеки.
Еще одно интересное решение проблемы параллельного программирования - это OpenMP, который представляет собой попытку предоставить переносимое расширение на различные платформы, чтобы дать компилятору подсказки о том, какие участки кода легко распараллелить.
Например (http://en.wikipedia.org/wiki/OpenMP#Work-sharing_constructs):
#define N 100000
int main(int argc, char *argv[])
{
int i, a[N];
#pragma omp parallel for
for (i=0;i<N;i++)
a[i]= 2*i;
return 0;
}
У обоих, конечно, есть свои преимущества и недостатки, но первый оказался чрезвычайно успешным в академических кругах и других тяжелых научных вычислительных приложениях. YMMV.
Для python вы можете попробовать использовать модуль обработки.
Майк Реттиг создал библиотеку .NET под названием Ретланг и порт Java под названием Jetlang, вдохновленный моделью параллелизма Erlang.
У Ульф Вигер недавно был отличный пост по этой теме - вот свойства, которые он определяет по мере необходимости, прежде чем вы сможете назвать что-то «Параллелизм в стиле Erlang»:
Номер 2 выше труднее всего поддерживать в виртуальных машинах и языковых реализациях, которые изначально не были предназначены для параллелизма. Это не для того, чтобы сбить с толку реализации параллелизма в стиле Erlang на других языках, но большая часть ценности Erlang исходит из возможности создавать миллионы процессов, что чертовски сложно, если абстракция процесса имеет отношение 1-1 с уровнем ОС. поток или процесс. У Ульфа есть много подробностей об этом по ссылке выше.
Термит для схемы гамбита.
Предупреждение: бессовестная вилка!
Я разработал библиотеку для такой передачи сообщений в Haskell: Распределенный Haskell в стиле Erlang.
Волкер
Если вы используете Ruby, взгляните на Revactor: [http://revactor.org/ visible[1]
Revactor - это реализация модели Actor для Ruby 1.9, построенная на основе высокопроизводительной библиотеки событий Rev. Revactor в первую очередь предназначен для написания сетевых сервисов и инструментов, подобных Erlang.
Взгляните на этот пример кода:
myactor = Actor.spawn do
Actor.receive do |filter|
filter.when(:dog) { puts "I got a dog!" }
end
end
Revactor работает только на Ruby 1.9. Я считаю, что автор библиотеки прекратил поддерживать ее, но документация на их сайте очень хорошая.
Вы также можете взглянуть на Reia: рубиновый язык сценариев, созданный на основе виртуальной машины Erlang. Reia - новый проект создателя Revactor: Тони Арьери.
Ответ Microsoft на Erlang, не готовый к производству: Microsoft Axum
JoCaml расширяет OCaml с помощью исчисления соединений для параллельного и распределенного программирования.
Akka (http://akka.io) сильно зависит от OTP erlang. Он основан на акторах scala и отлично подходит для параллелизма на JVM.
Основная трудность здесь заключается в том, что, хотя вы можете получить передачу сообщений на других языках, чрезвычайно сложно имитировать использование Erlang огромного количества процессов. Создание процессов в Erlang похоже на создание экземпляров объектов в Java или Python - вы об этом не задумываетесь. Если вы сделаете это на уровне ОС, у вас быстро закончатся ресурсы, а это означает, что речь идет не только о передаче сообщений, но и о объединении, которое должно быть реализовано в архитектуре. В этом отношении довольно сложно следовать виртуальной машине Erlang. Конечно, не для каждой проблемы требуются миллионы одновременных процессов.