2013-02-21 2 views
0

akka 2.1 고급 통신 패턴을 구현하고 싶습니다. 그러나 akka는 Scala의 배우와 핵심적인면에서 다른 것으로 보입니다. 스칼라의 배우가 나를 "수신"하고 부분적인 기능을 제공하는 것을 허용하는 곳에서 akka의 배우는 할리우드를 "우리에게 전화하지 마라, 우리는 당신을 부를 것이다"원칙을 채택하고 정적으로 수신 기능 만 정의하자. 내가 명시 적으로 수신 통화를, 여기에Autonomous AKKA 배우 호출 활성화

class MyActor extends Actor{ 

    override def act(){ 
    val x = expensiveFunc() 
    friend ! x 
    val y = receive { 
     case Answer(a) => println(a) 
    } 
    } 

} 

:

스칼라의 배우에서,이 같은 패턴을 가질 수있다. 그 이유는 각각 SPMD 프로그램을 수행하고 실행의 특정 지점에서 통신하는 자율적 인 액터가 필요하기 때문입니다. 의미있는 방식으로 AKKA를 사용하여이 패턴을 에뮬레이트 할 수 있습니까?


편집 나는 내 문제에 완전한 통찰력을 제공하기 위해 공정 같아요.

액터를 사용하여 SPMD 프로그램을 만들어야합니다. 이는 액터에 대한 동작을 정의 할 수 있어야한다는 것을 의미합니다. 이 아닌 만 반응합니다. 즉, 이전 스칼라 액터처럼 act()을 구현할 수 있어야합니다. 또한 이전 scala 액터에서와 같이 receive (p : PartialFunction [T, U])을 명시 적으로 호출해야합니다.

위의 두 가지 작업을 수행 할 수 있다면 SPMD 프로그램을 이전 액터에서 akka 액터로 포팅 할 수 있습니다. 그러나 나는 AKKA가 채택 할 것 같은 할리우드 패턴 (http://en.wikipedia.org/wiki/Hollywood_principle)으로 인해 행동 방법을 구현할 수 없다고 생각합니다.

EDIT2

나는 활성 수신 문제가 /이 같은 같은 unbecome하게 해결할 수 있습니다 생각 :

import context._ 
    def receive(p:PartialFunction[Any,Unit]){ 
    become(p) 
    receive() 
    unbecome() 
    } 

그러나이받을 수있는 중첩 된 호출을 허용해야합니다. 나는 내 배우가 수행하고자하는 동작을 캡슐화

case class Act(b:()=> Unit) extends Serializable 

을 : 나는 단순히 같은 메시지를 전송하여 행위 방법을 에뮬레이트 할 수있는 기회가있다.

+3

이 작업을 수행하는 가장 좋은 방법 것은 사용하는 것입니다 [미래] (http://doc.akka.io/docs/akka /2.1.0/scala/futures.html) – twillouer

+0

각 배우는 stateful입니다. 즉, 친구는 특정 배우입니다! – Felix

+1

그래서이 패턴을 물어 봅니다. [Ask] (http://doc.akka.io/docs/akka/snapshot/scala/actors.html) : 친구? x는 당신에게 미래를 줄 것이고 당신은 기다림을 할 수 있습니다. 예를 들어 결과를 얻거나, 미래의 onsuccess와 같은 결과를 얻으십시오 (println (a)) – twillouer

답변

0

액터 액터는 이벤트 위주입니다. 메시지가 액터 사서함에서 소비 될 준비가되면 액터에서 receive에 정의 된 부분 함수가 전달 된 메시지와 함께 호출됩니다.

즉, "수신"은 필수 구성이 아니며 호출 할 수 없습니다 다음 메시지를 기다리는 중입니다. 원하는 것은 정상적인 메시지 전달을 통해 달성 할 수 있습니다. 요청자 액터는 값 비싼 작업을 실행하는 작업자에게 데이터를 보낸 다음 응답을 다시 보냅니다.

+0

성능을 최대화하려면이 접근 방식을 피해야합니다. 처리 할 데이터를 보내면 시스템에 큰 병목 현상이 발생하고 마스터/슬레이브 시스템이 생성됩니다. 내 프로그램에서는 작동하지 않습니다. – Felix

관련 문제