2016-12-20 4 views
0

저는 스칼라에서 akka 액터를 사용하고 있습니다. 액터가있는 방법이 있는지 알고 싶습니다. 액터는받은 메시지를 처리하는 동안 주기적으로 다른 메시지에 대한 사서함을 검사 할 수 있으며이 메시지를 따르면 해당 변수를 변경할 수 있습니다.주기적으로 액터 편지함을 확인하고 스칼라에서 변수를 변경하는 방법

같은 계획 :

class Actor1 (constructors){ 

    def receive={ 
     case "go" => run()  //the actor starts 
     case "alter variables" // a new message is stashed in mailbox 
    } 

    def run={ 
     //do stuff 
     check(mailbox) //while the porocessing of the "go" message 
        // is not finished 
     if ("alter variables" in mailbox) { 
      change a variable value 
     } 
    } 

}

+0

내가 왜 그렇게하고 싶은지 모르겠지만, Akka가 시행하려고하는 디자인 패턴을 깨뜨릴 것이라고 생각합니다. 따라서 나는 그것을하지 않을 것입니다. 메시지를 넣는 자신 만의 큐를 구현하여 유사한 큐를 검사 할 수있는 다른 메커니즘을 사용할 수도 있습니다. – childofsoong

+0

이것은 불가능합니다. 액터는 한 번에 하나의 메시지 만 처리합니다 *. 이것이 병행 환경에서 안전한 변경 가능 상태를 보장하는 방법입니다. – Ryan

답변

0

아무것도 당신이 배우 내부, 미래를 사용하여 다른 스레드로 오랫동안 실행중인 작업을 이동할 수 없습니다 말한다. 다른 스레드가 사용자의 처리를 방해하는 동안 액터는 사서함의 메시지에 계속해서 응답합니다. 나중에 콜백을 설정하고 작업이 정상적으로 완료되도록 할 수 있습니다.

+0

콜백에서 액터의 상태를 변경하는 것은 매우 위험하므로 수행하지 않아야합니다. – Ryan

+0

Futures를 사용하고 싶지 않습니다. 이미 시도했기 때문에 결과적으로 현재 작성중인 코드가 단일 코어 버전보다 느립니다. 나는 언제든지 내 사서함에 액세스하거나 같은 시스템에있는 두 명의 다른 액터의 변수에 액세스하려고합니다. – Noowada

+0

@ user1834705 그건 불가능합니다. – Ryan