gen_server and priority queues

Rick Pettit rpettit@REDACTED
Tue Oct 25 20:19:13 CEST 2005


On Tue, Oct 25, 2005 at 02:06:40PM -0400, Serge Aleynikov wrote:
> 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.

Actually, I believe it perfectly illustrates his point (which, btw, was that
the _low_ priority will be processed first, regardless of the pattern clause
order in the receive).

-Rick

> ------------------------------
>      -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
> serge@REDACTED



More information about the erlang-questions mailing list