私は現在、Scalaコードでakka Actorシステムを使用しています。私には親の俳優と俳優がいます。私がしたいことは、親の俳優でリストを開始し、子を俳優にさせることです:Scalaのakkaアクタシステム内のグローバル変数
i)新しい要素を生成し、それらを親の俳優に送ってリストに添付します。 ii)いつでもリストの要素にアクセスできます。
2番目の(ii)の部分はどのように達成できますか?
私は現在、Scalaコードでakka Actorシステムを使用しています。私には親の俳優と俳優がいます。私がしたいことは、親の俳優でリストを開始し、子を俳優にさせることです:Scalaのakkaアクタシステム内のグローバル変数
i)新しい要素を生成し、それらを親の俳優に送ってリストに添付します。 ii)いつでもリストの要素にアクセスできます。
2番目の(ii)の部分はどのように達成できますか?
さて、私は解決策を見つけることができました。
親アクタ内で変数を作成し、それを子アクタに建設パラメータとして渡すと、この変数のすべての変更が置換されないと表示されます。私は偽の例の後に正しい例を説明します。
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
}
親が返信できる特定のメッセージを選択して、内部ステータスを開示することができます。同じ現象は、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につながる可能性があります。
問題は、実行中に、私はこのリストへのアクセス権を持っているしたいということです。私は子供の俳優に「スタート」メッセージを受け取り、関数を実行し、その関数内でListにアクセスできるようにしたい。私は、最初のメッセージが処理されるのを待ってから、2番目のメッセージを処理したくありません。 – Noowada
簡単に言えば:できません。これはAkkaのあらゆる教義に違反します。 – Ryan
質問を再定義しました:http://stackoverflow.com/questions/41247523/how-to-periodically-check-an-actor-mailbox-and-alter-variables-in-scala – Noowada
このソリューションはAkkaのアンチパターンであり、お勧めできません。まず第一に、 'ListBuffer'はスレッドセーフなコレクションではないことに注意してください。第2に、スレッドセーフなコレクションを選択しても、位置の透明性が失われます。シリアライズは不可能なためです。さらに読むhttp://manuel.bernhardt.io/2016/08/02/akka-anti-patterns-shared-mutable-state/ –