2013-03-24 3 views
2

ActorControl, ActorA, ActorB 등 3 명의 액터가 서로 통신한다고 가정 해 봅니다.Akka 액터의 동시 처리 문제

ActorA와 ActorB는 ActorControl과 통신합니다. 그들이받는 메시지는 대부분 다르지만 동일한 메시지 X가 있습니다. X를 얻을 때 둘 다 함수 Y를 수행해야합니다.

중복 코드를 피하기 위해 공통이라는 객체를 패키지화하기 위해 Y 함수를 꺼 냈습니다.

이 경우 ActorA와 ActorB가 모두 common.Y를 동시에 호출 할 수 있습니다.

제 질문은 이런 식으로 제가 배우의 동시성을 방해하고 있는지 아닌지입니다.

답변

4

액터 전체에서 코드를 공유 할 수 있지만 데이터를 공유 할 수는 없습니다. 당신의 기능이 순전히 (무국적이고 부작용이 없다면) 전혀 문제가 없다.

는 여기에 몇 가지 예입니다 : 마지막 두 함수에서

object Helper { 

    // Safe 
    def incrementPure(total: Int, i: Int) = total + i 

    //Unsafe 
    private var total = 0 
    def incrementStateful(i: Int) = { total += i; total } 

    //Unsafe 
    def incrementSideEffect(i: Int) = { 
    val total = readCurrentTotal() 
    val total2 = total + i 
    saveCurrentTotal(total2) 
    total2 
    } 

} 

, 당신은 동기화 어떤 종류의를 제공해야합니다. 그러나 병렬 처리에 의존 할 경우 성능에 잠재적으로 영향을 미칠 수 있습니다.

+1

순수하지 않은 경우 동일한 코드로 두 개의 함수를 사용하거나 하나의 '공유'함수를 사용하면 차이가 있습니까? –

+1

@tzofia 예, 순수하지 않은 경우 문제가 발생할 수 있지만 해결 방법은 여러 가지가 있습니다. 더 많은 정보를 제공하면 본인 (또는 다른 사람)이 귀하의 문제에 대한 해결책을 제시 할 수 있습니다. – paradigmatic

+0

하나의 함수 또는 두 개의 equals 함수를 사용할 때 (함수가 순수하지 않을 때) 차이점이있는 경우에 대한 예제를 제공 할 수 있습니까? 나는 왜 다른가 될지 이해할 수 없다 ... –