1

私は scala が初めてで、複数 (たとえば 30 個) のアクターを作成し、それらの間でメッセージを渡すプログラムを scala で作成しようとしています。

以下は私が今まで管理してきたものです:

 import scala.actors.Actor
 import scala.util.Random

    class MyActor(val id:Int, val N:Int) extends Actor {
        def act() {
            println ("Starting actor: " + id)    

            /**
                 react{

                        case str : String =>
                              println("Received Msg: " + str)

                              val randNo : Int = Random.nextInt(N)
                              println("Actor " + id + " Picking a random actor: " + randNo) 

            // Here, I should forward the message received to the ALREADY created and started actors    
                             // val objActor = new MyActor(randNo : Int, N : Int)
                             // objActor.start
                             // objActor ! str
                        }
            */
        }
    }

    object Main {

    def main(args:Array[String]) {

        if(args.length == 0)
        {
            println("Usage scala Main <numNodes>")
            sys.exit()
        }

        val N : Int = (args(0)).toInt

        // Starting all actors

         for (i: Int <- 0 to N-1) {
                val a = new MyActor(i : Int, N : Int)
                println ("About to start actor " + a.id)
                a.start 
         //   a!"Broadcast this msg to all actors"
         } 
      }
    }

このプログラムの目的は、複数のアクターを作成し、あるアクターから別のアクターに文字列を転送することです。

上記のコードは、コマンド ライン引数として指定された「N」個のアクターを作成します。これらのアクターは、オブジェクト Main によって作成および開始されます。メインは、上記で作成されたアクターの 1 つだけにメッセージを送信する必要があります。メインからメッセージを受信したアクターは、同じメッセージを別の作成済み/開始済みのアクターに転送する必要があります。

これは可能ですか?もしそうなら、正しい方向に私を導くことができますか?

よろしくお願いします、MS

4

2 に答える 2

5

最初に、Akka アクターをチェックすることをお勧めします。これは、Scala 2.10 で Scala アクターをすぐに置き換えます。これは、今後数か月以内にリリースされる予定です。

そうは言っても、間違いなく可能です。ワークフローは次のようになります (少なくとも Akka では)。

  1. メソッドで を作成ActorSystemしますmain
  2. オブジェクトを返すメソッドを介して、Actor必要に応じてスポーンします。ActorSystemactorOfActorRef
  3. これらActorRefの のいずれかを選択してメッセージを送信します。

Actor実装では、どうにかして(Actorおそらくコンストラクターを介して) 他のものを認識しString、システム全体にどのように伝達するかを考えます (この点に関して、私は通常、Scala ケース クラスをメッセージとして使用することを好みます)。

この種のシステムはステート マシンのように聞こえます。私が遊んでいて頭に浮かんだアイデアの 1 つは、 をActorSystemグラフ エンティティとして扱うActorことです。 a Vector[ActorRef])。

また、Akka チームが最近導入した新しいActors DSLを確認することもできます。

Akka の詳細については、次のリソースをお勧めします。

  1. NY Scala での Jonas Bonér の最近の講演で Akka を紹介
  2. Akka in Action (MEAP)
于 2012-09-29T07:43:23.507 に答える