1

Actor内部から反応を呼び出すと、これは呼び出しをブロックしますか、Actorそれとも他のリクエストを処理していますか?

class worker extends Actor()
{
  def act() = {
    loop {
      react {
        msg =>
          var foo = another_actor !? 'bar' //Block here?
          println(foo)
      }
    }
}
4

2 に答える 2

3

!?常に呼び出しスレッドをブロックします。アクターの反応ブロックの途中で呼び出された場合、呼び出し元のアクターもブロックされます。

アクターの主なアイデアは、単一の実行スレッドです。現在のメッセージの処理が完了するまで、アクターは次のメッセージに進みません。このように、メッセージが不変である限り、開発者は並行性について心配する必要はありません。

于 2009-08-10T13:56:34.863 に答える
2

アクターがメッセージを同時に処理できない(つまり、各アクターが受信トレイを順番に処理する)という事実については、この質問を参照してください。

Scalaでのプログラミングの説明から、これがあまり明確ではないと私は確かに思います。オンザフライのアクターを作成することで、(ある種の)目的を達成できます。

loop {
   react {
      case Command(args) =>
         val f = other !! Request(args) //create a Future
         //now create inline actor
         val _this = self
         actor { //this creates an on-the-fly actor
           _this ! Result(args, f.get) //f.get is a blocking call              
         }
      case Result(args, result) =>
         //now process this 
   }
}

もちろん、オンザフライのアクターはブロックしますが、元のアクターは新しいメッセージを処理できるようになります。現在プールされているすべてのワーカースレッドがビジーの場合、アクターサブシステムはactors.maxPoolSize(デフォルトは)までの新しいスレッドを作成します。256

于 2009-08-10T18:15:36.717 に答える