0

値を継続的に更新する手順があります。現在の値の操作を定期的に照会できるようにしたいと考えています。私の特定の例では、すべての更新は改善と見なすことができ、手順は最終的に最良の回答に収束しますが、中間結果へのアクセスが必要です。ループの実行速度と収束にかかる時間が重要です。

例として、次のループを考えてみましょう。

var current = 0
while(current < 100){
  current = current + 1
}

ループの繰り返しで現在の値を取得できるようにしたい。

アクターを使用したソリューションは次のようになります。

class UpdatingActor extends Actor{
  var current : Int = 0
  def receive = {
    case Update => {
      current = current + 1
      if (current < 100) self ! Update
    }
    case Query => sender ! current
  }
}

become または FSM を使用して var を取り除くこともできますが、この例はより明確な IMO です。

あるいは、1 つのアクターが操作を実行し、すべてのループ反復で更新された結果を別のアクターに送信することもできます。別のアクターは、値の更新とそれに関するクエリへの応答だけを担当します。私は Akka の「エージェント」についてあまり知りませんが、これは 1 つの潜在的な使用例のようです。

Scalaを使用してこれを行うためのより良い/代替方法は何ですか? アクターを使用する必要はありません。それは頭に浮かんだ1つの解決策に過ぎませんでした。

4

2 に答える 2

0

質問の範囲は少し広いですが、試してみます:)

まず、あなたの例はまったく問題ありません..を取り除く意味がわかりませんvar. これがアクターの目的です: 可変状態を保護します。

第二に、あなたが説明したことに基づいて、俳優はまったく必要ありません。

class UpdatingActor {
  private var current = 0
  def startCrazyJob() {
    while(current < 100){
      current = current + 1
    }
  }

  def soWhatsGoingOn: Int = current 
}

startCrazyJob呼び出すスレッドが1 つと、定期的に呼び出す 2 つ目のスレッドが必要ですsoWhatsGoingOn

私見、アクター アプローチの方が優れていますが、このユース ケースのためだけに akka ライブラリをインポートする価値があるかどうかを判断するのはあなた次第です。

于 2013-11-07T14:02:37.993 に答える