gen_server and priority queues

Matthias Lang <>
Tue Oct 25 06:29:18 CEST 2005


Dominic wrote:
 > I was under the impression that:
 > 
 > receive
 >    {high, Msg} ->
 >       ...;
 >    {medium, Msg} ->
 >       ...;
 >    {low, Msg} ->
 >       ...;
 > end,
 > 
 > pulls higher priority messages out of the queue?

Before Marc Feeley set me straight at an EUC years ago, I carried the
same _incorrect_ impression around for a couple of years without ever
running into a situation where a program's behaviour was affected in a
way that mattered enough for me to notice reality.

For the practically minded:

     -module(dominic).
     -export([go/0]).
     
     go() ->
       Pid = spawn_link(fun() -> rx() end),
       Pid ! low,
       Pid ! high,
       io:fwrite("both messages sent\n").
     
     rx() ->
       timer:sleep(1000),
       receive
         high -> io:fwrite("received high\n");
         low -> io:fwrite("received low\n")
       end.

For those who still doubt, plus language lawyers, the erlang reference
manual explains 'receive' in section 1.6.10:

   | Receives messages sent to the process using the send operator (!). The
   | patterns Pattern are sequentially matched against the first message in
   | time order in the mailbox, then the second, and so on.

   http://www.erlang.se/doc/doc-5.4/pdf/reference_manual-5.4.pdf

Matthias



More information about the erlang-questions mailing list