이 스칼라 배우가 핸들러에 새 배우를 만들 때 차단합니까?
-
11-09-2019 - |
문제
다음 코드가 있습니다.
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 }
이 버전은 완전히 차단하지 않습니다.
제휴하지 않습니다 StackOverflow