2

アクター モデルを使用して scala で渡される基本的なメッセージを理解するのを手伝ってくれる人はいますか?

3 つのアクターで簡単なプログラムを作成しようとしています。

  1. アクター「BossActor」は、2 つのアクター「Actor1」と「Actor2」を作成します。

  2. 「Actor1」は 2 つの整数引数を受け取ります -> それらの合計を見つけます -> 合計を Actor2 に渡します

  3. 「Actor2」は合計を出力します

package actorsSum

import scala.actors.Actor
import scala.actors.Actor._

case object BossActor
case object Actor1
case object Actor2

object SumOf2Numbers extends App
{

    print ("Enter Num1 : ")
    val Num1 = readInt()
    print ("Enter Num2 : ")
    val Num2 = readInt()

    var Sum = 0

    val bossActor = new BossActor(Num1,Num2,Sum)
    bossActor.start

}

/** Boss Actor which creates and controls all subsequent actors */
class BossActor(Num1: Int, Num2: Int, Sum: Int) extends Actor {
    def act() {

        val act1 = new Actor1(Num1,Num2)
        val act2 = new Actor2(Sum)
        act1.start
        act2.start

    }
}

/** Actor to find sum of the numbers */

class Actor1 (Num1: Int, Num2: Int) extends Actor {
    def act() {

        val Grandtotal = Num1 + Num2

        /** send "Grandtotal" to Actor2 */
        // act2 ! Grandtotal

    }
}

/** Actor to print the sum */

class Actor2(Sum: Int) extends Actor {
    def act() {

        react{

            /** print the sum */

            case Actor1 => println ("Sum: " + Sum)

            case Sum => println ("Sum: " + Sum)


        }
    }
}
4

3 に答える 3

3

私は別のアプローチを取るでしょう。アクターはメッセージを受け取り、それに反応します。したがって、2 つの数値を合計し、メッセージで指定されているレシーバーに送信するリクエストを受け取るアクターを作成する必要があります。それは次のようになります。

import scala.actors.Actor

case class Sum(x: Int, y: Int)

class SumActor extends Actor {
  def act = {
    loop {
      receive {
        case (Sum(x,y), receiver: Actor) => receiver ! x+y
      }
    }
  }
}

class Receiver extends Actor {
  def act = {
    loop {
      receive {
        case x: Int => println("Received: " + x)
      }
    }
  }
}

val sumActor = new SumActor
val receiver = new Receiver

sumActor.start
receiver.start

sumActor ! Sum(3,4) -> receiver

Akkaも見てください。今後の scala のリリースで scala アクターが置き換えられ、より強力になるためです。しかし、アクターの基本を理解するには、scala アクターから始めるだけで十分です。

于 2012-09-05T09:27:12.820 に答える
1

まず、実行中のコードは次のとおりです。

import scala.actors.Actor
import scala.actors.Actor._

object Main extends App {
    print("Enter first number: ")
    private[this] val num1 = readInt()
    println(num1)
    print("Enter second number: ")
    private[this] val num2 = readInt()
    println(num2)

    private[this] val boss = new BossActor(num1, num2)
    boss.start()
}

case object Stop

class BossActor(num1: Int, num2: Int) extends Actor {
    def act {
        val sumer = new SumActor()
        val printer = new PrintingActor()
        sumer.start()
        printer.start()
        sumer ! num1
        sumer ! num2
        receive {
            case i: Int => printer ! i
        }
        sumer ! Stop
        printer ! Stop
        exit()
    }
}

class SumActor extends Actor {
    private[this] var firstOption: Option[Int] = None

    def act() {
        loop {
            react {
                case i: Int => if (firstOption.isDefined) {
                    sender ! i + firstOption.get
                    firstOption = None
                } else {
                    firstOption = Some(i)
                }
                case Stop => exit()
            }
        }
    }

}

class PrintingActor extends Actor {

    def act() {
        loop {
            react {
                case Stop => exit()
                case e => println(e)
            }
        }
    }

}

私はあなたのように数字を読みます。私が新しいを作成するよりもBossActor。次に、ボスは受信Intした を に送信しSumActorます。sumer は 2 つの値を加算し、boss に返します。上司は合計を に送信しますPrintingActor。プリンターは数字を印刷します。その後、ボスはアクターに終了メッセージを送信し、自分自身を終了します。これは、上司に 2 つを送信することで改善される可能性がありますIntが、この単純な例では、Actorパラメーターを使用して作成する方法を示している可能性があります。

于 2012-09-05T06:13:15.630 に答える
1

まず第一に、送信者(Actor1)は受信者(Actor2)について知っている必要があるため、送信者の前に受信者を作成して開始し、コンストラクター引数として受信者を送信者に渡す必要があります。

varアクターの状態を共有するために使用しないでください。

ケース オブジェクトをメッセージとして使用することは良い考えですが、値を送信するにはケース クラスを使用する必要があります。

import scala.actors.Actor
import scala.actors.Actor._

case class Sum(i: Int)

class Sender(a1: Int, a2: Int, receiver: Actor) extends Actor {
  def act() {
    receiver ! Sum(a1 + a2)
  }
}

class Receiver extends Actor {
  def act() {
    react {
      case Sum(i) => println("Sum: " + i)
    }
  }
}

val receiver = new Receiver().start()
val sender = new Sender(1, 2, receiver).start()

オブジェクト Actor からいくつかのヘルパー メソッドを使用できます。

import scala.actors.Actor._

val receiver = actor { react { case i: Int => println("Sum: " + i) } }
val sender = actor { receiver ! 1 + 2 }
于 2012-09-05T06:22:13.813 に答える