[SCALA] 캔 스칼라 배우가 동시에 여러 메시지를 처리?
SCALA캔 스칼라 배우가 동시에 여러 메시지를 처리?
내 최근의 질문에 대한 응답은 배우가 한 번에 그 메시지를 처리 것으로 나타났다. 이 사실인가요? 나는 명시 적으로 다음 코드 포함 (스칼라 프로그래밍에서) 것을 말한다 아무것도 볼 (PP를. 593)
(강조는 자신의 나). 두 관련 (상호 배타적) 질문 :
편집 : 테스트의 비트를하고는 내가 잘못하고 배우가 실제로 순차적 것을 부담 것으로 보인다. 그래서 내가 대답해야 할 그것의 질문 # 2
해결법
-
==============================
1.배우 한 번에 하나의 메시지를 처리합니다. 여러 개의 메시지를 처리하는 고전적인 패턴은 소비자 배우의 풀 (pool)에 대해 하나의 코디네이터 배우 전면을하는 것입니다. 사용 후 반응하는 경우 소비자 풀은 클 수 있지만 여전히 JVM 스레드의 작은 숫자를 사용합니다. 여기에 내가 10 개 소비자와 그들에 대한 전면 하나의 코디네이터의 풀을 생성하는 예입니다.
배우 한 번에 하나의 메시지를 처리합니다. 여러 개의 메시지를 처리하는 고전적인 패턴은 소비자 배우의 풀 (pool)에 대해 하나의 코디네이터 배우 전면을하는 것입니다. 사용 후 반응하는 경우 소비자 풀은 클 수 있지만 여전히 JVM 스레드의 작은 숫자를 사용합니다. 여기에 내가 10 개 소비자와 그들에 대한 전면 하나의 코디네이터의 풀을 생성하는 예입니다.
import scala.actors.Actor import scala.actors.Actor._ case class Request(sender : Actor, payload : String) case class Ready(sender : Actor) case class Result(result : String) case object Stop def consumer(n : Int) = actor { loop { react { case Ready(sender) => sender ! Ready(self) case Request(sender, payload) => println("request to consumer " + n + " with " + payload) // some silly computation so the process takes awhile val result = ((payload + payload + payload) map {case '0' => 'X'; case '1' => "-"; case c => c}).mkString sender ! Result(result) println("consumer " + n + " is done processing " + result ) case Stop => exit } } } // a pool of 10 consumers val consumers = for (n <- 0 to 10) yield consumer(n) val coordinator = actor { loop { react { case msg @ Request(sender, payload) => consumers foreach {_ ! Ready(self)} react { // send the request to the first available consumer case Ready(consumer) => consumer ! msg } case Stop => consumers foreach {_ ! Stop} exit } } } // a little test loop - note that it's not doing anything with the results or telling the coordinator to stop for (i <- 0 to 1000) coordinator ! Request(self, i.toString)
이 코드를 사용할 수있는 소비자를 판정하고 소비자에게 요청을 보냅니다. 대안은 무작위로 소비자에게 할당 또는 라운드 로빈 스케줄러를 사용한다.
당신이 무엇을하고 있는지에 따라, 당신은 더 나은 스칼라의 선물로 제공 될 수 있습니다. 당신이 정말로 다음 배우가 필요하지 않은 경우 예를 들어, 위의 기계 모두 같이 쓸 수있다
import scala.actors.Futures._ def transform(payload : String) = { val result = ((payload + payload + payload) map {case '0' => 'X'; case '1' => "-"; case c => c}).mkString println("transformed " + payload + " to " + result ) result } val results = for (i <- 0 to 1000) yield future(transform(i.toString))
-
==============================
2.나는 대답이 배우가 aynchronously 메시지를 처리 할 수라고 생각합니다. 당신은 그것을 이렇게 기록 할 수 이러한 메시지는 비동기 적으로 처리 할 수있는 메시지, 듣고해야한다 배우가있는 경우 :
나는 대답이 배우가 aynchronously 메시지를 처리 할 수라고 생각합니다. 당신은 그것을 이렇게 기록 할 수 이러한 메시지는 비동기 적으로 처리 할 수있는 메시지, 듣고해야한다 배우가있는 경우 :
val actor_ = actor { loop { react { case msg => //create a new actor to execute the work. The framework can then //manage the resources effectively actor { //do work here } } } }
-
==============================
3.여러 일을하고 싶은 경우에 당신은 여러 배우를 사용해야합니다. 배우를 사용하는 전체 이유는 여러 개의 독립적 인 프로세스 사이의 일을 분할하는 것입니다.
여러 일을하고 싶은 경우에 당신은 여러 배우를 사용해야합니다. 배우를 사용하는 전체 이유는 여러 개의 독립적 인 프로세스 사이의 일을 분할하는 것입니다.
-
==============================
4.당신은 선물 개념을 사용하여 시도 할 수 있습니다. 모든 메시지는 그 모든 것을 처리하려고 다음 선물을 사용하고 보관하십시오.
당신은 선물 개념을 사용하여 시도 할 수 있습니다. 모든 메시지는 그 모든 것을 처리하려고 다음 선물을 사용하고 보관하십시오.
from https://stackoverflow.com/questions/1007010/can-scala-actors-process-multiple-messages-simultaneously by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 스칼라 컴파일에서 PermGen 공간 : 어떻게 java.lang.OutOfMemoryError와를 방지하기 위해? (0) | 2019.11.14 |
---|---|
[SCALA] 어떻게 스칼라의 (2.8) 매니페스트 작동합니까? (0) | 2019.11.14 |
[SCALA] scala.concurrent.blocking - 실제로 무엇을합니까? (0) | 2019.11.14 |
[SCALA] 패키지 오브젝트 (0) | 2019.11.14 |
[SCALA] 스칼라에서 FORALL (0) | 2019.11.14 |