2012-01-02 18 views
6

私は、erlangプロセスと話すときに、異なるメッセージに異なる優先順位を割り当てることができると考えています。メッセージに異なる優先順位を付ける巧妙な方法はありますか?

私は高優先度のメッセージを最初に処理し、次に低優先度を処理できるようにしたいと考えています。

私が試したの異なるアプローチ、アプローチ1:

loop() -> 
    receive 
     {high, Msg} -> 
      Do something with the message, 
      loop() 
     after 0 -> 
      ok 
    end, 
    receive 
     {low, Msg} -> 
      Do something with the message, 
      loop() 
     after 0 -> 
      loop() 
    end. 

これは仕事をしていませんが、それは遅い静かです。私は受信が、それが実行されるたびに「高い」メッセージがあるかどうかを見るためにすべてのメッセージを調べなければならないと思います。

アプローチ2:

また、私はその後、高キューのいずれかにメッセージを送信したり、メッセージは「フロントデスク」への最初のセット「フロントデスク」だったメディエーター型アプローチをやってみました低キュー、そして最終的にここilustratedとして、その後、低キューから、「労働者のスレッドが高キューfirskからジョブを要求し、そのキューは何も持っていない場合:

enter image description here

これは持っていました要求が異なるキューの先頭に到達するまで待たなければならないという欠点があります。おそらく何らかの優先順位システムが機能します。 )

このようなことを行うにはスマートな方法がありますか?

答えて

11

私はこの論文は、あなたの質問に答えると思う:

https://www.erlang-solutions.com/upload/docs/9/erlang11-nystrom.pdf

基本的には次のように受信したい:

receive 
    {hi_priority, Msg} -> Msg 
after 0 -> 
    receive 
    Msg -> Msg 
    end 
end 

をアーランのマニュアルがタイムアウトすることを意味し、「0後」が言うようにメールボックスに一致する(優先順位)メッセージがない場合、すぐに発生します。私はそれを行うのいずれかよりスマートな方法を認識していないです

:)

+2

恐ろしい、Fhatは、私が「非重要」メッセージを読んで取得した後、履歴書を受信して​​い:-) –

+0

探していただけで何でしたか?だから私が今重要なことがなければ、重要でないものを読んだ後も重要なものを待つのだろうか? – Bula

関連する問題