2016-12-19 6 views
1

私は現在、Scalaコードでakka Actorシステムを使用しています。私には親の俳優と俳優がいます。私がしたいことは、親の俳優でリストを開始し、子を俳優にさせることです:Scalaのakkaアクタシステム内のグローバル変数

i)新しい要素を生成し、それらを親の俳優に送ってリストに添付します。 ii)いつでもリストの要素にアクセスできます。

2番目の(ii)の部分はどのように達成できますか?

答えて

-1

さて、私は解決策を見つけることができました。

親アクタ内で変数を作成し、それを子アクタに建設パラメータとして渡すと、この変数のすべての変更が置換されないと表示されます。私は偽の例の後に正しい例を説明します。

class ParentActor(/*constructors here*/) extends Actor{ 
    val list =ListBuffer[Int](1,2) 
    child = new ChildActor(list //+other constructors) 

    list=ListBuffer[Int](1,2,3) // **wrong** child will see list=List(1,2) 
    list+=3   // **right** child will see list=List(1,2,3) as wanted 

}

class ChildActor(list : ListBuffer[Int] /*++ otherconstructors here*/) extends Actor{ 

     list=ListBuffer[Int](1,2,3,4) // **wrong** parent will see list=List(1,2,3) 
     list+=4   // **right** child will see list=List(1,2,3,4) as wanted 

}

+0

このソリューションはAkkaのアンチパターンであり、お勧めできません。まず第一に、 'ListBuffer'はスレッドセーフなコレクションではないことに注意してください。第2に、スレッドセーフなコレクションを選択しても、位置の透明性が失われます。シリアライズは不可能なためです。さらに読むhttp://manuel.bernhardt.io/2016/08/02/akka-anti-patterns-shared-mutable-state/ –

1

親が返信できる特定のメッセージを選択して、内部ステータスを開示することができます。同じ現象は、var queue内部に親を保つ代わりにcontext.become +再帰を使用することにより達成可能であること

import scala.collection.immutable.Queue 

    class Parent extends Actor { 
    import Parent._ 

    // TODO: start children here 

    override def receive: Receive = receiveElements(Queue.empty[Element]) 

    def receiveElements(acc: Queue[Element]): Receive = { 
     case [email protected] => context.become(receiveElements(acc :+ e)) 
     case GetElements => sender ! acc 
    } 
    } 

    object Parent { 
    case class Element(s: String) 
    case object GetElements 
    } 

注:以下の例を参照してください。

また、キューをフラッシュする方法を設計しないと、OOMEにつながる可能性があります。

+0

問題は、実行中に、私はこのリストへのアクセス権を持っているしたいということです。私は子供の俳優に「スタート」メッセージを受け取り、関数を実行し、その関数内でListにアクセスできるようにしたい。私は、最初のメッセージが処理されるのを待ってから、2番目のメッセージを処理したくありません。 – Noowada

+1

簡単に言えば:できません。これはAkkaのあらゆる教義に違反します。 – Ryan

+0

質問を再定義しました:http://stackoverflow.com/questions/41247523/how-to-periodically-check-an-actor-mailbox-and-alter-variables-in-scala – Noowada

3

お客様を使用してください。 2人のアクターの間でどのような種類の可変状態を共有しても、Akkaが提供するすべての保証に違反します。

エージェントを子供と親の俳優の間で共有することができます。これにより、同期読み取りを許可しながらリストの更新を線形化します。

+0

したい: – Noowada

+0

http://stackoverflow.com/questions/41247523/how-to-periodically-check-an-actor-mailbox-and-alter-variables-in-scala – Noowada

関連する問題