2013-05-19 14 views
2

Akka 프레임 워크를 사용하여 여러 파일에 동시에 쓰려고합니다. 먼저 파일에 쓰는 MyWriter라는 클래스를 만든 다음 선물을 사용하여 두 번 호핑하는 클래스를 호출합니다. 파일은 나를 위해 만들어 지지만, 프로그램의 실행을 모니터 할 때, 먼저 첫 번째 파일을 채운 다음 두 번째 파일을 채 웁니다 (블로킹/동 기적으로).비동기 결과에 Akka와 함께 선물 사용하는 방법

Q : 어떻게 코드를 넣고 실행 (없음-차단/비동기) 할 수

import akka.actor._ 
import akka.dispatch._ 
import akka.pattern.ask 
import akka.util.Timeout 

import scala.concurrent.Await 
import scala.concurrent.duration._ 
import scala.concurrent.Future 
import scala.concurrent.{ ExecutionContext, Promise } 
import ExecutionContext.Implicits.global 

class my_controler { 

} 

object Main extends App { 

    val system = ActorSystem("HelloSystem") 
    val myobj = system.actorOf(Props(new MyWriter), name = "myobj") 
    implicit val timeout = Timeout(50 seconds) 
    val future2 = Future { myobj ! save("lots of conentet") } 
    val future1 = Future { myobj ! save("event more lots of conentet") } 

} 

MyWriter 코드 :

case class save(startval: String) 

class MyWriter extends Actor { 
    def receive = { 
    case save(startval) => save_to_file(startval) 
    } 

코드가 동시에 실행되지 않는 이유 어떤 아이디어?

+0

어떻게 '저장'이 정의 되었습니까? –

+0

ok 질문을 편집하여 추가하십시오. – CruncherBigData

+4

하드 디스크는 병렬 액세스를 좋아하지 않습니다. 그들은 천천히 - 많이. 같은 hd에 있다면 파일을 병렬로 쓰지 마십시오. 또한 이미 언급 된 다른 사람들처럼 장래에 배우와의 의사 소통을 포기하지 마십시오. – SpiderPig

답변

4

Future과 함께 ?으로 전화를 거는 이유는 무엇입니까? 어쨌든 (?)가 Future을 반환하므로 여기서 뭘하고있는 것은 Future을 또 다른 Future 주위로 감싸는 것입니다. 저는 여러분이하고 싶었던 것을 surte가 아닙니다.

두 번째 문제점은 동일한 액터 인스턴스로 두 개의 메시지를 보내고 있으며 동시에 두 개의 메시지가 병렬로 실행될 것으로 예상한다는 것입니다. 액터 인스턴스는 메일 박스를 순차적으로 처리합니다. 동시에 처리하려는 경우이를 수행하기 위해 두 번째 인스턴스 인 FileWriter 액터가 필요합니다. 그게 전부라면 FileWriter의 다른 인스턴스를 시작하고 두 번째 메시지를 보내면됩니다.

+0

당신은 절대적으로 정확합니다. 동일한 객체를 인스턴스화했습니다. 이제 두 개의 다른 객체를 만들었고, 병렬로 작동했습니다. 많은 감사합니다. – CruncherBigData

+0

질문이 하나 더 있는데, 내가 FileWriter의 100 인스턴스를 말하고 싶다면 어떻게해야할까요? – CruncherBigData

+2

그런 시나리오에서는 풀 라우터를 사용하고 라운드 로빈 또는 최소 사서함 전략과 같은 것을 사용하는 것이 좋습니다. 배우들이 오래 살았고 라우터 뒤에 앉아서 메시지를 그들에게 배포합니다. 이 작업을하는 방법에 대해서는'Routers' 문서를 확인하십시오. 그러나 생성 지점에서'system.actorOf (Props [MyWriter] .withRouter (RoundRobinRouter (100)), "filewriter")' . 문서 도구 : http://doc.akka.io/docs/akka/2.1.4/scala/routing.html – cmbaxter

관련 문제