在Erlang中的两个进程之间交换消息

时间:2013-11-11 20:45:59

标签: concurrency erlang

嗨,我正在学习Erlang,在这个过程中,我正在尝试从Erlang execises page进行练习。特别是我正在解决的问题是我必须创建一个函数来创建两个进程,将M个消息发送给另一个然后死掉。我遇到了麻烦,这是我的代码:

-module(roundtrip).
-export([talk/1]).

talk(M) ->
    init(M).

init(M) ->
    P1 = start(M),
    P2 = start(M),
    P2 ! {P1, a_message}.

myProc(M) ->
    if M =:= 0 ->
        io:format("Bye cruel world!~n")
    end,
    receive
        {From, a_message} ->
            From ! {self(), a_message},
            myProc(M-1);
        _ -> 
            io:format("I don't understand~n"),
            myProc(M)

    end.

start(M) ->
    spawn(?MODULE, myProc, [M]).

当我给谈话打电话时,我得到以下错误:

  

=错误报告==== 2013年11月11日:: 21:21:00 ===过程中的错误< 0.46.0>退出值:{undef,[{roundtrip,proc,“\ n”,[]}]}

     

=错误报告==== 2013年11月11日:: 21:21:00 ===过程中的错误< 0.47.0>退出值:{undef,[{roundtrip,proc,“\ n”,[]}]}

我正在解决它,但我无法弄清楚问题是什么......

感谢。

2 个答案:

答案 0 :(得分:3)

您需要导出myProc/1功能。或者您可以使用spawn/1

start(M) ->
   spawn(fun() -> myProc(M) end).

答案 1 :(得分:3)

由于您使用spawn/3,因此需要导出myProc

另一个问题是,M =/= 0时你的if条件不包括其他可能性。我会这样做:

-module(roundtrip).

-export([talk/1]).

talk(M) ->
    init(M).

init(M) ->
    P1 = start(M),
    P2 = start(M),
    P2 ! {P1, a_message}.

myProc(M) ->
    case M of
        0 ->
            io:format("Bye cruel world!~n");
        _ ->
            receive
                {From, a_message} ->
                    From ! {self(), a_message},
                    io:format("~p ~p~n", [self(), M]),
                    myProc(M-1);
                _ ->
                    io:format("I don't understand~n"),
                    myProc(M)

            end
    end.

start(M) ->
    spawn(fun() -> myProc(M) end).

请注意,我使用case代替ifspawn/1代替spawn/3