Erlang での優先受信は、次のように簡単に実装できます。
prio() ->
receive
{priority, X} -> X
after 0 ->
receive
X -> X
end
end.
私は、Nyström によるPriority Messaging made Easyという論文を読んでいます。そこでは、次の問題が説明されています。
[上記の] [コード] の例の主な問題は、内部ブロッキング受信から評価が再開されたときに、メールボックスに複数のメッセージがある可能性があることを考慮していないことです。最悪のシナリオでは、潜在的に膨大な数の要素のうち、最初の要素を除くすべてが優先メッセージになる可能性があります。このシナリオでは、実際には、意図したこととは正反対のことを達成したことになります。
私はこれを完全に理解していません。
質問 (1): 1 つのメッセージがメッセージ キューに到着するとすぐに、内部ブロッキング受信が「呼び出される」(つまり再開される) と仮定しますよね? 内部ブロッキング受信から再開するのにかかる短い時間内に、キューで待機している大量のメッセージが既にあると想定するのは現実的ですか?
質問 (2): また、最悪のシナリオは、1 つの通常のメッセージと多数の優先メッセージを持つキューとして説明されています。すべての receive 句は、最初にキュー内の最初のメッセージに対してチェックされ、次にキュー内の 2 番目のメッセージに対してチェックされるため、...(ソース: この本、69 ~ 70 ページ) ではありません。キューの最後に優先メッセージがあるメッセージ?