program tip

동시성 모델 : Erlang 대 Clojure

radiobox 2021. 1. 11. 07:57
반응형

동시성 모델 : Erlang 대 Clojure


Clojure를 사용하여 동시 프로그램을 작성할 것입니다.이 프로그램은 엄청난 양의 수신 메일에서 키워드를 추출하여 데이터베이스와 교차 검사 할 것입니다.

내 팀원 중 한 명이이 프로그램을 작성하기 위해 Erlang을 사용할 것을 제안했습니다.

여기서 저는 함수형 프로그래밍에 익숙하지 않은 것을 주목하고 싶습니다. 그래서 clojure가이 프로그램을 작성하는 데 좋은 선택인지 아니면 Erlang이 더 적합한 지 의심 스럽습니다.


두 언어와 런타임은 동시성에 대해 서로 다른 접근 방식을 사용합니다.

  • Erlang은 서로 통신하는 많은 경량 프로세스를 프로그램합니다. 이 경우 작업과 데이터를 많은 작업자에게 보내는 마스터 프로세스와 결과 데이터를 처리하는 더 많은 프로세스가있을 것입니다.

  • Clojure는 여러 스레드가 공통 데이터 구조를 사용하여 데이터와 상태를 공유하는 디자인을 선호합니다. 많은 스레드가 동일한 데이터 (읽기 전용)에 액세스하고 변경 가능한 상태를 거의 공유하지 않는 경우에 특히 적합합니다.

가장 적합한 모델을 결정하려면 애플리케이션을 분석해야합니다. 이는 또한 사용하는 외부 도구 (예 : 동시 요청을 처리하는 데이터베이스의 기능)에 따라 달라질 수 있습니다.

또 다른 실제 고려 사항은 clojure가 많은 오픈 소스 라이브러리를 사용할 수있는 JVM에서 실행된다는 것입니다.


정말 동시 또는 분산을 의미합니까?

동시 (멀티 스레드, 멀티 코어 등)를 의미한다면 Clojure가 자연스러운 솔루션이라고 말하고 싶습니다.

  • Clojure의 STM 모델은 스레드 간의 공유 상태를 저장하고 관리하는 데 매우 효율적이기 때문에 멀티 코어 동시성을 위해 완벽하게 설계되었습니다. 더 많은 것을 이해하고 싶다면 이 훌륭한 비디오를 볼 가치가 있습니다.
  • Clojure STM은 동시 스레드에 의한 안전한 데이터 변형을 허용합니다. Erlang은 모든 것을 불변으로 만들어이 문제를 회피합니다. 그 자체로는 괜찮지 만 공유 된 가변 상태가 진정으로 필요한 경우에는 도움이되지 않습니다. Erlang에서 변경 가능한 상태를 공유하려면 효율적이거나 편리하지 않은 일련의 메시지 상호 작용으로 구현해야합니다 (비공유 모델의 가격입니다 ....).
  • Clojure는 메시지 전달에 의존하지 않으므로 스레드 간의 통신이 훨씬 더 효율적일 수 있기 때문에 대규모 시스템에서 동시 설정에있는 경우 Clojure를 사용하면 본질적으로 더 나은 성능을 얻을 수 있습니다.

분산 (즉, 격리 된 프로세스로 효과적으로 실행되는 네트워크를 통해 작업을 공유하는 여러 다른 컴퓨터)을 의미한다면 Erlang이 더 자연스러운 솔루션이라고 말하고 싶습니다.

  • Erlang의 변경 불가능하고 공유되지 않는 메시지 전달 스타일은 배포 할 수있는 방식으로 코드를 작성해야합니다. 따라서 관용적 인 Erlang 은 여러 시스템에

    자동으로 배포되고 분산 된 내결함성 설정에서 실행될 수 있습니다.
  • 따라서 Erlang은이 사용 사례에 매우 잘 최적화되어 있으므로 자연스러운 선택이 될 것이며 확실히 가장 빠르게 작업 할 수 있습니다.
  • Clojure도이를 수행 할 수 있지만 훨씬 더 많은 작업을 직접 수행해야합니다 (예 : 분산 컴퓨팅 프레임 워크를 구현하거나 선택해야 함). Clojure는 현재 기본적으로 이러한 프레임 워크를 제공하지 않습니다.

장기적으로 저는 Clojure가 Erlang과 일치하는 분산 컴퓨팅 프레임 워크를 개발하기를 바랍니다. 그러면 두 세계 모두를 최대한 활용할 수 있습니다!


Clojure는 Java JVM에서 실행되는 Lisp입니다. Erlang은 처음부터 높은 내결함성과 동시성을 갖도록 설계되었습니다.

이 작업은 이러한 언어 중 하나와 다른 많은 언어로도 수행 할 수 있다고 생각합니다. 귀하의 경험은 귀하가 문제를 얼마나 잘 이해하고 언어를 얼마나 잘 알고 있는지에 달려 있습니다. 두 가지 모두를 처음 접한다면 어떤 것을 선택하든 문제가 어려울 것이라고 말하고 싶습니다.

Lucene / Solr와 같은 것에 대해 생각해 보셨습니까? 문서 색인화 및 검색을위한 훌륭한 소프트웨어입니다. 귀하의 상황에 대해 "교차 검사"가 무엇을 의미하는지 모르겠지만 이것은 고려할 좋은 해결책이 될 수 있습니다.


내 접근 방식은 각 언어로 간단한 테스트를 작성하고 각 언어의 성능을 테스트하는 것입니다. 두 언어 모두 C 스타일 언어와는 다소 다르며 익숙하지 않은 경우 (그리고 익숙한 팀이없는 경우) 유지 관리의 악몽에 빠질 수 있습니다.

나는 또한 Groovy 1.8과 같은 것을 사용할 것입니다. Groovy는 이제 병렬 컴퓨팅을 가능하게하는 GPars를 포함합니다. Groovy에서 문자열 및 파일 조작은 실제로 매우 쉽습니다.


  1. 그것은 당신이 무엇을 의미하는지에 달려 있습니다.
  2. erlang의 문자열은 고통 스럽습니다 ..

그러나:

거대한 것은 수십 개의 분산 된 컴퓨터를 의미한다면, erlang을 사용하여 텍스트 친화적 인 언어 (python ?, perl?)로 작업자를 작성하는 것보다. 동시성이 높은 로컬 작업자와 함께 상단에 분산 레이어가 있습니다. 각 작업자는 erlang 프로세스로 표시됩니다. 더 많은 성능이 필요하면 작업자를 C로 다시 작성하십시오. Erlang에서는 다른 언어로 말하기가 매우 쉽습니다.

거대하다면 여전히 하나의 강력한 시스템이 JVM과 함께 사용된다는 것을 의미합니다. 그럼 크지 않습니다.

거대한 시스템이 수백 대라면 C ++ 스택에서 Google과 같은 강력한 (bigtable, map / reduce) 무언가가 필요할 것이라고 생각합니다. Erlang은 여전히 ​​괜찮지 만 코드를 작성하려면 좋은 개발자가 필요합니다.

참조 URL : https://stackoverflow.com/questions/6244170/concurrency-model-erlang-vs-clojure

반응형