복붙노트

[SCALA] 캔 스칼라 배우가 동시에 여러 메시지를 처리?

SCALA

캔 스칼라 배우가 동시에 여러 메시지를 처리?

내 최근의 질문에 대한 응답은 배우가 한 번에 그 메시지를 처리 ​​것으로 나타났다. 이 사실인가요? 나는 명시 적으로 다음 코드 포함 (스칼라 프로그래밍에서) 것을 말한다 아무것도 볼 (PP를. 593)

(강조는 자신의 나). 두 관련 (상호 배타적) 질문 :

편집 : 테스트의 비트를하고는 내가 잘못하고 배우가 실제로 순차적 것을 부담 것으로 보인다. 그래서 내가 대답해야 할 그것의 질문 # 2

해결법

  1. ==============================

    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. ==============================

    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. ==============================

    3.여러 일을하고 싶은 경우에 당신은 여러 배우를 사용해야합니다. 배우를 사용하는 전체 이유는 여러 개의 독립적 인 프로세스 사이의 일을 분할하는 것입니다.

    여러 일을하고 싶은 경우에 당신은 여러 배우를 사용해야합니다. 배우를 사용하는 전체 이유는 여러 개의 독립적 인 프로세스 사이의 일을 분할하는 것입니다.

  4. ==============================

    4.당신은 선물 개념을 사용하여 시도 할 수 있습니다. 모든 메시지는 그 모든 것을 처리하려고 다음 선물을 사용하고 보관하십시오.

    당신은 선물 개념을 사용하여 시도 할 수 있습니다. 모든 메시지는 그 모든 것을 처리하려고 다음 선물을 사용하고 보관하십시오.

  5. from https://stackoverflow.com/questions/1007010/can-scala-actors-process-multiple-messages-simultaneously by cc-by-sa and MIT license