gen_server and priority queues

Serge Aleynikov <>
Tue Oct 25 20:06:40 CEST 2005


Matthias,

I actually run your example (modified to add the recursive call at the 
end), and got:

7> c(dominic).
{ok,dominic}
8> test1:go().
both messages sent
ok
received low
received high
exited
9>

I believe your point was that the high priority message will get process 
first, but this is not the case according to this printout.

Serge

------------------------------
      -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")
        after 10000 ->
          io:fwrite("exited\n"),
          exit(normal)
        end,
        rx().
------------------------------

Matthias Lang wrote:
> 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
> 

-- 
Serge Aleynikov
R&D Telecom, IDT Corp.
Tel: (973) 438-3436
Fax: (973) 438-1464




More information about the erlang-questions mailing list