Actor
内部から反応を呼び出すと、これは呼び出しをブロックしますか、Actor
それとも他のリクエストを処理していますか?
class worker extends Actor()
{
def act() = {
loop {
react {
msg =>
var foo = another_actor !? 'bar' //Block here?
println(foo)
}
}
}
Actor
内部から反応を呼び出すと、これは呼び出しをブロックしますか、Actor
それとも他のリクエストを処理していますか?
class worker extends Actor()
{
def act() = {
loop {
react {
msg =>
var foo = another_actor !? 'bar' //Block here?
println(foo)
}
}
}
!?
常に呼び出しスレッドをブロックします。アクターの反応ブロックの途中で呼び出された場合、呼び出し元のアクターもブロックされます。
アクターの主なアイデアは、単一の実行スレッドです。現在のメッセージの処理が完了するまで、アクターは次のメッセージに進みません。このように、メッセージが不変である限り、開発者は並行性について心配する必要はありません。
アクターがメッセージを同時に処理できない(つまり、各アクターが受信トレイを順番に処理する)という事実については、この質問を参照してください。
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