gen_server and priority queues
Serge Aleynikov
serge@REDACTED
Tue Oct 25 20:31:31 CEST 2005
Sorry I misunderstood Matthias' point. Thanks for clarification,
though, as I was also under impression that the order of pattern clauses
mattered!
Serge
Rick Pettit wrote:
> 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
>
>
--
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