でScala主体の過程で複数のメッセージ。
-
06-07-2019 - |
質問
の返信 最近の問題の鉱山で示される俳優の加工、メッセージ 時間がない.はたしてそうなのだろうか?見ていることを明示的には( プログラミングスカラるには、以下の項目のスニペット(pp.593)
場合【
react
法を見出すことができるメッセージを扱う【】スケジュールの取り扱いるメッセージ 後で実行 例外をスローしま
(重視の二つの関係と相互に排他)の質問:
- 仮に、俳優の加工-複数のメッセージsimulatenously,させるにはどうすればいいのでし俳優の処理メッセージ1時間の場合アドバイスをお聞かせ下さい)?(使用
receive
?) - たことを想定して俳優のプロセスのメッセージを同時に、あなたは何点ぐらいになると思い最善の実施俳優と え 工程の同時のメッセージ
編集:味試験のようで熊私が間違っていて、その主体は実にシーケンシャルです。この質問には#2あるいは必要に応答
解決
アクタフローのメッセージです。クラシックパターン処理に複数のメッセージはコーディネーターを俳優のフロントにてプールの消費者の俳優たち。ご利用の場合に反応し、消費者のプールできる大きなものの、依然としての使用は少数の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)
このコード試験を事前にご確認ください消費者の利用は、送を依頼する。代替するだけでランダムに割り当て消費者を利用するラウンドロビンを提供します。
によって何を確認することができまされることもありますので、よりいただScalaのです。例えば不要なのかもしれません主体のすべての機械にして作成できま
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))
他のヒント
という答えがあるという Actor
お取扱いできないメッセージaynchronously.とした場合 Actor
すべきメッセージを聞くがこれらのメッセージ 扱うことができ非同期的に, こと書くことはできません:
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
}
}
}
}
たいのであれば複数のものを使用複数の俳優たち。全体の理由で利用者に分け作業の中で複数の独立したプロセス。
所属していません StackOverflow