[erlang-questions] Can Erlang messages be delivered out of order?
Johnny Billquist
bqt@REDACTED
Sun Jan 25 04:06:37 CET 2009
Sergey S wrote:
> Hello.
>
> Does Erlang runtime guarantee that messages will be delivered in
> exactly the same order as they were sent?
>
> To illustrate my question I've written a simple example:
>
> %-------------
> process_flag(trap_exit, true),
> Parent = self(),
>
> spawn_link(fun() ->
> Parent ! hello,
> Parent ! world
> end)
>
> receive hello -> ok end,
> receive world -> ok end,
> receive {'EXIT', _Pid, normal} -> ok end.
> %-------------
>
> Is it guaranteed by the runtime that the 'hello' message will always
> be the first message put into mailbox, 'world' - the second one, and
> {'EXIT', _Pid, normal} - third?
If you read the manual, you'll find that each process have it's own
receive queue, and that new messages are always placed at the end of
that queue.
So, for you example, yes. The messages will be in the order you expect.
It always becomes more interesting when you have several processes doing
sends to the same target process, since then it's impossible to tell
which message will be first in the queue in that case, but that should
be pretty obvious. :-)
However, your example program don't work the way you seem to expect
anyway. The receive function isn't actually extracting the first message
in the receive queue, but the first *matching* message.
So, even if the messages would have been pleced in the wrong order, your
program would have worked just as fine.
Johnny
More information about the erlang-questions
mailing list