Erlang과 Go 동시 프로그래밍, CSP와 액터의 객관적인 차이점은 무엇입니까?


19

Erlang 및 Go 프로그래밍 언어로 동시 프로그래밍을 조사하고있었습니다. 내 발견에 따라 그들은 각각 액터 모델과 CSP가 사용됩니다.

그러나 여전히 CSP와 Actors의 객관적인 차이점은 무엇입니까? 이론 상으로는 다르지만 같은 개념입니까?


Go는 Erlang과 다른 프리미티브 세트를 제공하기 때문에 동일하지 않습니다. 또한 Go는 Erlang 및 C와 같은 수준보다 훨씬 낮습니다.
Daniel Gratzer

다음에 어떤 언어, 기술 또는 프로젝트를 수행해야하는지에 대한 질문은 답변에 대한 주관적인 의견 만 유치 할 수 있으므로 프로그래머에 대한 주제와는 관련이 없습니다. 질문 뒤에는 많은 가치가있어 지속적인 가치가있는 답변을 만들 수 없습니다. 추천 독서 : Gorilla vs Shark
gnat

3
@gnat 동의하지 않습니다. 이것은 CSP와 Actors의 객관적인 차이점에 대한 것입니다. 그것은 매우 합리적인 질문입니다
Daniel Gratzer

2
문제는 좋고 나쁜 것이 아니라 결정해야 할 것이기 때문에이 질문은 구체적이며 주관적인 토론의 원인이 아닙니다.
nish1013

1
CS Theory StackExchange에는이 질문에 대한 훌륭한 답변이 있습니다 : Actor Concurrency의 Actor 모델과 통신하는 순차적 프로세스의 차이점
Jörg W Mittag

답변:


21

실제로는 거의 차이가 없습니다. 둘 다 외부 세계와의 기본 인터페이스가 메시지를 통한 별도의 실행 단위를 나타냅니다 .

차이점은 언어의 구현 세부 사항에 있습니다. 다음은 몇 가지 세부 사항입니다.

  • Go의 채널이 입력됩니다. 다른 데이터로 메시지를 보내려면 별도의 채널이 필요합니다. Erlang을 사용하면 receive모든 것이 프로세스로 전송되고 패턴 일치해야합니다 (Go에서는 select여러 경우를 사용하므로 코드가 다른 채널과 매우 유사하게 보입니다).
  • 누구나 Go 채널을 읽거나 쓸 수 있습니다. Erlang에서는 누구나 프로세스에 보낼 수 있지만 해당 프로세스 만받습니다. 여러 작업자간에 작업을 분할하려는 경우 이는 중요합니다. Erlang에서는 배포 프로세스를 만들어야하지만 Go는 단순히 채널을 공유 할 수 있습니다.
  • Erlang은 여러 호스트 / VM에 프로세스를 배포 할 수있는 투명한 경로를 제공합니다. 고 루틴은 단일 프로세스로 제한되어 있습니다 (배포를위한 라이브러리는 있지만).
  • 오류 처리는 매우 다릅니다. Erlang은 각 프로세스를 독립적으로 처리합니다. 한 프로세스의 오류 (예 : 0으로 나누기)는 명시 적으로 연결하지 않는 한 다른 프로세스에 영향을 미치지 않습니다 (비활성화 된 프로세스에서 메시지를 기다리는 것이 중단 되더라도). 고 루틴은 모두 같은 프로세스 공간에서 실행됩니다. 0으로 나누면 전체 프로그램이 중단됩니다.
  • Erlang에서는 데이터를 변경할 수 없습니다. 이는 프로세스와 외부 세계 간의 모든 커뮤니케이션 이 메시지를 통해 이루어짐을 의미합니다. Go를 사용하면 goroutines간에 상태를 공유 할 수 있습니다 (그렇지 않아도 안 됨).

이 마지막 요점은 가장 중요하다고 생각합니다. 둘 다 메시지를 주요 의사 소통 수단 으로 사용하지만 Erlang은 상태가 언제 어떻게 변경 될 수 있는지에 대해 훨씬 더 강력한 보증을합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.