[erlang-questions] process will stack overflow after received many message?

Håkan Mattsson hm@REDACTED
Fri Sep 16 11:05:16 CEST 2011


Your last call to io:format/2 is making the function non tail recursive.

/Håkan

On Fri, Sep 16, 2011 at 10:57 AM, Jovi Zhang <bookjovi@REDACTED> wrote:
> On Fri, Sep 16, 2011 at 4:44 PM, Robert Raschke <rtrlists@REDACTED> wrote:
>>
>> On Fri, Sep 16, 2011 at 9:38 AM, Jovi Zhang <bookjovi@REDACTED> wrote:
>>>
>>> Hi,
>>>    I am a newbie of Erlang, here I have a question for receive
>>> message in Erlang loop.
>>>    Like below Erlang code, when process receive one message, it will
>>> invoke loop again,
>>>    then it can service like a server, receive message forever.
>>>    BUT is possible that process will stack overflow after receive too
>>> many message? the process invoke loop again and again.
>>>
>>>    I saw there have many code write like this in <<Programming Erlang>>
>>> book.
>>>
>>> loop() ->
>>>    receive
>>>        hello ->
>>>            io:format("hello\n"),
>>>            loop();
>>>        Other ->
>>>            io:format("I don't know what is this message, ~p is ~n"
>>> ,[Other]),
>>>            loop()
>>>    end.
>>>
>>
>> No stack overflow, due to tail call optimisation. See also
>> http://www.erlang.org/doc/reference_manual/functions.html#id74170
>>
>> Robby
>>
>
> Thanks, but when I test it using escript, the result is like below,
> "loop end" printed two times, it means it stacked!
>
> [root@REDACTED Erlang]# cat jovi.erl
> #!/usr/bin/env escript
>
> loop() ->
>    receive
>        one ->
>            io:format("one\n"),
>            loop();
>        two ->
>            io:format("two\n")
>    end,
>    io:format("loop end\n").
>
>
> main(_) ->
>    Pid = spawn(fun() -> loop() end),
>    Pid ! one,
>    Pid ! two,
>    receive
>        _Any -> void
>    end.
>
>
> [root@REDACTED Erlang]# ./jovi.erl
> one
> two
> loop end
> loop end



More information about the erlang-questions mailing list