문제

다음 코드가 있습니다.

actor {
  loop {
     react {
       case SomeEvent =>
         //I want to submit a piece of work to a queue and then send a response 
         //when that is finished. However, I don't want *this* actor to block
         val params = "Some args"
         val f: Future[Any] = myQueue.submitWork( params );
         actor {
           //await here
           val response = f.get
           publisher ! response
         }

     }
  }
}

내가 이해했듯이 외부 배우는 차단하지 않을 것입니다. f.get 그것은 실제로 별도의 배우에 의해 수행되고 있기 때문에 SomeEvent 매니저).

이 올바른지?

도움이 되었습니까?

해결책

예, 맞습니다. 당신의 외부 배우는 단순히 배우를 만들고 일시 중단합니다 (다음 메시지를 기다립니다). 그러나 이런 종류의 일에 매우주의하십시오. 내부 액터는 스케줄러에서 자동으로 시작하여 스레드로 처리됩니다. 그 실 차단 될 것입니다 그 미래에 (Java.util.concurrent.future처럼 보입니다). 이 시간을 충분히 수행하면 사용 가능한 모든 스레드가 선물을 차단하는 기아 문제를 해결할 수 있습니다. 배우는 기본적으로 작업 대기열이므로 대신 의미를 사용해야합니다.

다음은 코드의 버전입니다. Scalaz 배우 도서관. 이 라이브러리는 표준 스칼라 액터보다 훨씬 간단하고 이해하기 쉽습니다 (소스는 말 그대로 페이지 반입니다). 또한 많은 Terser 코드로 이어집니다.

actor {(e: SomeEvent) => promise { ... } to publisher }

이 버전은 완전히 차단하지 않습니다.

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