Scala Actor のa に依存すると、reply
信じられないほどエラーが発生しやすいように思えます。これは本当に、アクター間で会話を行うための Scala の慣用的な方法ですか? reply
私が見逃している別の方法、またはより安全な使用方法はありますか?
(私について: Java での同期には精通していますが、アクター ベースのシステムを設計したことがなく、パラダイムを完全に理解していません。)
間違いの例
簡単なデモとして、このばかげた整数解析アクタを見てみましょう。
import actors._, Actor._
val a = actor {
loop {
react {
case s: String => reply(s.toInt)
}
}
}
これを次のように使用することができます
scala> a !? "42"
res0: Any = 42
しかし、アクターが応答しない場合 (この場合、不注意なプログラマーがアクターを捕まえようとは考えていなかったためNumberFormatException
)、永遠に待機することになります。
scala> a !? "f"
コールサイトも間違えます。Int
アクターがメッセージに返信しないため、次の例も無期限にブロックします。
scala> a !? 42
タイムアウト
!? (msec: Long, msg: Any)
予想される応答に妥当な時間制限があることがわかっている場合に使用できますが、私が考えることができるほとんどの状況ではそうではありません。
返信保証
考えられるのは、すべてのメッセージに必ず応答するようにそのアクターを設計することです。
import actors._, Actor._
val a = actor {
loop {
react {
case m => reply {
try {
m match {
case s: String => reply(s.toInt)
case _ => None
}
} catch {
case e => e
}
}
}
}
}
!?
これで気分は良くなりますが、アクターがもはや演技していないという誤った呼び出しの恐れがまだ少しあります。