문제

나는 배우들을 대기열 인 것처럼 취급하는 데 어떤 종류의 제한이있는 프로그램에서 배우를 사용하고 싶습니다. 예를 들어, 변경 이벤트가 적용되는 외부 시스템과 외부 시스템 데이터의 캐시가 있다고 가정합니다. 그래서 저는 2 명의 배우가 있습니다.

  1. ChangeApplicationActor
  2. CacheActor

의 일부로 ChangeApplicationActor, 일부 엔티티에 변경을 적용 할 때 X 외부 시스템에서는 이벤트를 보내고 싶습니다. CacheActor 동기화 :

val changeApplicationActor = actor { 
  loop {
    react {
      case ChangeInstruction(x) => 
        externalSystem.applyChange(x)
        cacheActor ! Sync(x)
    }
  }
}

그러나 이제 두 가지 요구 사항이 있습니다.

  1. 그만큼 CacheActor 내부 상태를 가지고 있으며 이상적으로는 그것을 처리하기를 원합니다. Sync 지시를 순차적으로
  2. 내가 끝나면 CacheActor두 개가 포함 된받은 편지함 Sync(x) 동일한 값에 대한 지침 x, 두 번째를 무시하고 싶습니다 (즉, 보류중인 하나만 있어야합니다. Sync 주어진 값에 대한 지침 x)

배우가 싱글 스레드를 강요하는 방법이 있습니까? 배우의 사서함에 액세스하고 중복 이벤트를 제거 할 수있는 방법이 있습니까? 구현을 피할 수 없습니다 CacheActor 음, 배우가 아닙니다?

도움이 되었습니까?

해결책

배우는 한 번에 하나의 스레드에서만 실행하도록 보장되며 배우의 사서함의 메시지는 FIFO 순서로이므로 #1이 있습니다.

2는 그것에 대한 지원이 내장되어 있지 않기 때문에 까다 롭습니다. 배우에는 "사서함"이라는 속성이 있습니다. 수신 또는 반응을 통한 대신 사서함에 직접 액세스 할 수 있습니다. 메시지를 처리하기 전에 사서함에서 일치하는 동기화 메시지를 호출하기 만하면됩니다. 이 작업을 수행 할 때는 다른 스레드가 메시지 보내기 중에 사서함에 물건을 추가하는 것을 시도하지 않으려면 액터와 동기화해야합니다.

행위자의 동기화는 라이브러리의 교착 상태 보증을 제거하고 확장 성을 줄일 수 있습니다. 그러나 실제적인 관점에서 당신은 아마 괜찮을 것입니다.

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