multithreading - 액터 - 언제 Actor 모델을 사용해야합니까?




액터 모델 (2)

액터 모델 은 언제 사용해야합니까?

확실히 교착 상태가없는 환경을 보장하지는 않습니다.

B가 B를 기다리는 동안 A 액터는 B로부터 메시지를 기다릴 수 있습니다.

또한 배우가 다음 작업으로 넘어 가기 전에 메시지가 처리되었는지 확인해야하는 경우에는 직접 차단 대신 "메시지 처리 완료"메시지를 보내고 기다려야합니다.

모델의 힘은 무엇입니까?


동시성 문제가 있다면, 배우의 사용 여부를 결정하는 데있어 무엇이 필요할까요?

우선 문제를 정의 할 것입니다. 중첩 된 for 루프 또는 재귀의 속도 향상에 대한 주된 동기는 무엇입니까? 그렇다면 간단한 작업 기반 접근법이나 병렬 루프 접근법이 배우보다는 잘 작동 할 것입니다.

그러나 종속성을 포함하고 공유 상태를 조정하는보다 복잡한 시스템을 가지고 있다면 액터 접근법이 도움이 될 수 있습니다. 특히 액터와 메시지 전달 의미의 사용을 통해 명시 적 잠금을 사용하여 실제로 해당 상태 (메시지)의 사본을 만들고 공유 상태를 보호함으로써 공유 상태를 보호하는 것을 피할 수 있습니다.

식사 철학자와 수면 이발소 문제와 같은 고전적인 동기화 문제로이 작업을 매우 쉽게 수행 할 수 있습니다. 그러나 '배우'를 사용하여보다 현대적인 패턴을 도울 수 있습니다. 즉, 외관이 배우가 될 수 있고, 모델보기 및 컨트롤러가 서로 통신하는 배우가 될 수도 있습니다.

제가 관찰 한 또 다른 사실은 배우 의미가 대부분의 개발자가 학습 할 수 있고 잠긴 상대보다 안전하다는 것입니다. 이는 추상화 수준을 높이고 잠금을 사용하여 데이터에 대한 모든 액세스를 보호하는 대신 해당 데이터에 대한 액세스 조정에 집중할 수있게 해주기 때문입니다. 예를 들어 데이터 멤버가있는 간단한 클래스가 있다고 상상해보십시오. 해당 데이터 멤버에 대한 액세스를 보호하기 위해 해당 클래스에 잠금을 설정하는 경우 해당 클래스의 모든 메서드는 잠금 아래에서 해당 데이터 멤버에 액세스하는지 확인해야합니다. 이것은 나중에 다른 사람 (또는 당신)이 나중에 수업을 수정할 때 특히 문제가되며, 그 열쇠를 사용하는 것을 기억 해야합니다.

반면에 해당 클래스가 액터가되고 데이터 멤버가 메시지를 통해 통신하는 버퍼 또는 포트가되면 의미가 버퍼에 내장되어 있으므로 잠금을 취하는 것을 잊지 않아도됩니다. 당신이 버퍼의 타입에 기반하여 그것을 막을 지 여부.

-약간 뒤틀리게 하다


액터의 사용법은 최소한 두 가지 경우에 "자연 스럽습니다"

  1. 독립적 인 작업 세트에서 문제를 분해 할 수있는 경우.
  2. 명확한 worflow (즉, 데이터 흐름 프로그래밍 )로 연결된 일련의 작업에서 문제를 분해 할 수있는 경우.

예를 들어, 일련의 필터를 사용하여 복잡한 데이터를 처리하는 경우 각 액터가 업스트림 액터의 데이터를 받고 다운 스트림 액터로 데이터를 설정하는 액터 파이프 라인을 사용하기 쉽습니다.

물론이 데이터 흐름은 선형이 아니어야하며 파이프 라인에서 단계가 느린 경우 대신 동일한 작업을 수행하는 액터 풀을 사용할 수 있습니다. 부하 분산 문제를 해결하는 또 다른 방법은 일종의 가상 Kanban 시스템으로 구성된 수요 중심 접근 방식을 사용하는 것입니다.

물론 거의 모든 흥미로운 경우에 액터 간의 동기화가 필요하지만 클래식 멀티 스레드 방식과는 달리이 동기화는 실제로 "구체적"입니다. 당신은 공장에서 사람들을 상상할 수 있습니다. 문제는 상상할 수 있습니다. (일을 할 수 없거나, 업스트림 작업이 너무 빠르며 중간 제품에 거대한 저장 공간이 필요합니다.) 유례를 통해보다 쉽게 ​​솔루션을 찾을 수 있습니다.





actor-model