배우에게 배우가 아닌 메시지를 보내는 것이 나쁜 관행입니까?

StackOverflow https://stackoverflow.com/questions/1058408

  •  21-08-2019
  •  | 
  •  

문제

속성이있는 수업이 있다고 가정합니다 actor_ 유형의 Actor. 내가하는 데 문제가 있습니까?

def someMethod() = {
  actor_ ! "HELLO"
}

또는 다른 배우로부터 항상 메시지를 보내야합니다. 예를 들어

def someMethod() = {
  Actor.actor { actor_ ! "HELLO" }
}
도움이 되었습니까?

해결책

때에 따라 다르지. 비 배우 코드에서 배우에게 메시지를 보내면 ActorProxy가 스레드 로컬에 자동으로 작성되고 저장됩니다. 이렇게하면 액터 프록시가 스레드가 GC가 될 때까지 gc'd가되지 않기 때문에 매우 작은 메모리 누출이 발생합니다. ActorProxy는 본질적으로 비 배우 스레드가 여러 가지면에서 메시지를받는 것을 포함하여 배우처럼 행동 할 수있게합니다.

더 큰 문제는 스레드가 관리되는 경우, 액터 라이브러리가 스레드를 관리하는 방식과 유사하게, 논리적 컨텍스트를 나타내는 것은 한 번에 한 스레드에 있고 다른 시간에 다른 스레드에있을 수 있습니다. 이것의 좋은 예는 서블릿 컨테이너입니다. 논리적 맥락은 서블릿이나 세션 일 수 있지만, ActorProxy는 스레드에 묶여 논리적 맥락에서 공유됩니다. 배우가 ActorProxy에 답장하지 않는다면 이것은 큰 문제가 아니지만, 그렇다면 (a) 대답이 잘못된 맥락에서 잠재적으로받을 수 있기 때문에 문제가 발생할 수 있습니다. 또는 (b) 메시지를받지 못하므로 이전에 언급 된 작은 누출은 ActorProxies의 사서함이 채워짐에 따라 큰 누출이됩니다.

편집] 흠 ... 읽기 문제가있는 것 같습니다! 액터 블록에서 그것을 둘러싸고 있으면 종료 될 때 올바르게 GC가 될 새로운 액터 객체를 만듭니다. 메시지 전송을 배우 블록에 넣는 것은 메시지 보내기가 다른 스레드에서 새로운 반응에서 수행 될 것이 아니라는 것을 의미합니다.

다른 팁

나는 그렇게하는 데 문제가 없다. 코드에서 의미가 있다면 왜 그렇지 않습니까? 순수한 배우 모델을 보면 모든 것이 배우이고 배우 만 서로 의사 소통을합니다.이과 같이 코드를 디자인 할 수 있다면 .. 비 배우에서 배우로의 메시지.

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