2014-10-23 2 views
4

저는 지금 스칼라 프로젝트를 진행하고 있습니다. 액터 모델보다 Akka의 에이전트 라이브러리를 사용하기로 결정했습니다. 왜냐하면 동시성에 대해보다 기능적으로 접근 할 수 있기 때문입니다. 한 번에 많은 다른 에이전트를 실행하는 문제. 한 번에 3 ~ 4 명의 요원 만 운영하는 데 모자를 씌우는 것처럼 보입니다.Concurrent Accka Agents in Scala

import akka.actor._ 
import akka.agent._ 
import scala.concurrent.ExecutionContext.Implicits.global 

object AgentTester extends App { 
// Create the system for the actors that power the agents 
implicit val system = ActorSystem("ActorSystem") 

// Create an agent for each int between 1 and 10 
val agents = Vector.tabulate[Agent[Int]](10)(x=>Agent[Int](1+x)) 

// Define a function for each agent to execute 
def printRecur(a: Agent[Int])(x: Int): Int = { 
    // Print out the stored number and sleep. 
    println(x) 
    Thread.sleep(250) 

    // Recur the agent 
    a sendOff printRecur(a) _ 

    // Keep the agent's value the same 
    x 
} 

// Start each agent 
for(a <- agents) { 
    Thread.sleep(10) 
    a sendOff printRecur(a) _ 
} 
} 

위의 코드는 1에서 10 사이의 각 정수를 포함하는 에이전트를 만듭니다. 하단 루프는 모든 에이전트에 printRecur 기능을 보냅니다. 프로그램의 출력에는 1에서 10까지의 숫자가 (아무 순서없이) 인쇄됩니다. 그러나 어떤 이유로 든 내 출력에는 1에서 4까지의 숫자 만 출력됩니다.

Akka에서 작동하는 에이전트를 사용할 수있는 더 표준적인 방법이 있습니까? 나는 clojure 배경에서 왔고 이전에이 패턴을 성공적으로 사용했기 때문에 스칼라에서 같은 패턴을 순진하게 사용했습니다.

답변

5

내 생각에 4 코어 상자에서 실행 중이며 이것이 숫자 1-4 만 표시되는 이유 중 일부입니다. 여기서 중요한 점은 시스템에서 추측하고있는 기본 실행 컨텍스트를 사용하고 있다는 것입니다. 시스템에서 4 개의 스레드 만있는 스레드 풀을 사용합니다 (각 코어에 하나씩). 이런 종류의 반복적 인 방식으로 이것을 코딩 한 방식으로, 처음 추측 한 4 개의 에이전트는 결코 스레드를 포기하지 않으며 모든 것을 인쇄 할 유일한 에이전트입니다. 당신이 ActorSystem

import system.dispatcher 

을 만든 후이가있는 배우가 시스템의 기본 디스패처를 사용합니다

import scala.concurrent.ExecutionContext.Implicits.global 

그리고이 줄을 추가 :

쉽게이 줄을 제거하여이 문제를 해결할 수 있습니다 샘플에서 가져온 기본 실행 컨텍스트와 동일한 문제가없는 것처럼 보이는 fork 조인 디스패처.

sendOff과 대조적으로 send을 사용하여 에이전트를 구성 할 때 사용 가능한 실행 컨텍스트를 사용할 수도 있습니다. 다른 실행 컨텍스트를 명시 적으로 사용하고자하는 경우에는 sendOff을 사용할 것이라고 생각합니다.

+0

sendOff를 사용하여 sendOff가 차이를 만들지는 않았지만 가져 오기를 스왑 아웃했습니다. 감사! – DrPepper