わかりました、2 セントを投入する必要があることがわかりました。著者の回答から、ここで必要なのは「優先受信」テクニックだと思います。「 Erlang: priority receive question here at SO 」で議論を見つけることができます。優先度の高いメッセージを最初に受け入れ、優先度の高いメッセージがない場合にのみ他のメッセージを受け入れるという考え方です。
Scala アクターは Erlang に非常に似ているため、これを実装する簡単なコードは次のようになります。
def act = loop {
reactWithin(0) {
case msg: HighPriorityMessage => // process msg
case TIMEOUT =>
react {
case msg: HighPriorityMessage => // process msg
case msg: LowPriorityMessage => // process msg
}
}
}
これは次のように機能します。アクターには、メッセージを含むメールボックス (キュー) があります。(receiveまたはreceiveWithin) 引数は部分関数であり、アクター ライブラリは、この部分関数に適用できるメールボックス内のメッセージを探します。私たちの場合、それはHighPriorityMessageonly のオブジェクトになります。したがって、アクター ライブラリがそのようなメッセージを見つけた場合、部分関数が適用され、優先度の高いメッセージが処理されます。それ以外の場合はreactWithin、タイムアウト 0 で引数を指定して部分関数を呼び出し、TIMEOUTすぐにキューから可能なメッセージを処理しようとします (メッセージを待機するため、 get の可能性を除外することはできませんHighPriorityMessage)。