문제

Erlang 스타일 동시성 모델(프로세스, 메일함, 패턴 일치 수신 등)을 제공하기 위해 다른 프로그래밍 언어에는 어떤 라이브러리가 있습니까?

메모:나는 스레딩이나 큐잉 라이브러리뿐만 아니라 Erlang과 유사하도록 의도된 것에 특히 관심이 있습니다.

도움이 되었습니까?

해결책

메시지 전달 인터페이스(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.

다른 팁

울프 위거 최근 이 주제에 대한 훌륭한 게시물이 있었습니다. "Erlang 스타일 동시성"이라고 부르기 전에 그가 정의한 속성은 다음과 같습니다.

  • 빠른 프로세스 생성/파괴
  • 특성이 거의 변하지 않은 >> 10,000개의 동시 프로세스를 지원하는 능력.
  • 빠른 비동기 메시지 전달.
  • 메시지 전달 의미론 복사(비공유 동시성)
  • 프로세스 모니터링.
  • 선택적 메시지 수신.

위의 2번은 처음에 동시성을 위해 설계되지 않은 VM 및 언어 구현에서 지원하기 가장 어렵습니다.이는 다른 언어에서 Erlang과 같은 동시성 구현을 손상시키려는 것이 아니지만 Erlang의 많은 가치는 다음을 생성할 수 있다는 점에서 비롯됩니다. 수백만 프로세스 추상화가 OS 수준 스레드 또는 프로세스와 1-1 관계를 갖는 경우 이는 매우 어렵습니다.Ulf는 위 링크에서 이에 대해 더 많은 정보를 제공합니다.

스칼라는 액터를 지원합니다.그러나 나는 의도적으로 Erlang과 유사한 스칼라를 호출하지 않을 것입니다.

그럼에도 불구하고 스칼라는 한번쯤 살펴볼 가치가 있습니다!

마이크로소프트 동시성 및 조정 런타임 .NET용.

CCR은 구성 요소를 메시지를 통해서만 상호 작용할 수있는 조각으로 분리하는 응용 프로그램 모델에 적합합니다.이 모델의 구성 요소는 메시지를 조정하고 복잡한 실패 시나리오를 처리하며 비동기 프로그래밍을 효과적으로 처리해야합니다.

또한 킬림 erlang 스타일 메시지 전달/액터를 Java 언어로 가져오는 Java용 라이브러리입니다.

Mike Rettig는 다음과 같은 .NET 라이브러리를 만들었습니다. 레틀랑 그리고 Erlang의 동시성 모델에서 영감을 받은 Jetlang이라는 Java 포트가 있습니다.

Erlang에 대한 Microsoft의 생산 준비가 완료되지 않은 답변: 마이크로소프트 악숨

파이썬의 경우 다음을 사용해 볼 수 있습니다. 처리 모듈.

흰개미 Gambit 계획을 위해.

Ruby를 사용하는 경우 Revactor를 살펴보세요.[http://revactor.org/][1]

Revactor는 Rev 고성능 이벤트 라이브러리 위에 구축된 Ruby 1.9용 Actor 모델 구현입니다.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 VM 위에 구축된 루비와 유사한 스크립팅 언어입니다.Reia는 Revactor 제작자의 새로운 프로젝트입니다.토니 아르시에리.

경고:뻔뻔한 플러그!

나는 Haskell에서 이런 종류의 메시지 전달을 위한 라이브러리를 개발했습니다.Erlang 스타일의 분산 Haskell.

볼커

조캠 동시 및 분산 프로그래밍을 위한 조인 계산으로 OCaml을 확장합니다.

아카(http://akka.io)은 erlangs OTP의 영향을 많이 받습니다.이는 스칼라의 액터를 기반으로 구축되었으며 JVM의 동시성에 적합합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top