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

Concurrency 在Erlang中的两个进程之间交换消息,concurrency,erlang,Concurrency,Erlang,嗨,我在学习Erlang,在这个过程中,我试着做一些来自网络的练习。特别是我要做的问题是,我必须创建一个函数,它创建两个进程,向另一个进程发送m个消息,然后消亡。我遇到了问题,这是我的代码: -module(roundtrip). -export([talk/1]). talk(M) -> init(M). init(M) -> P1 = start(M), P2 = start(M), P2 ! {P1, a_message}. myProc(

嗨,我在学习Erlang,在这个过程中,我试着做一些来自网络的练习。特别是我要做的问题是,我必须创建一个函数,它创建两个进程,向另一个进程发送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]).
当我调用talk时,我发现以下错误:

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

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

我正在四处寻找,但我不知道问题出在哪里


谢谢。

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

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

由于使用了
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
而不是
if
spawn/1
而不是
spawn/3

您能解释一下,如果我使用spawn/3,为什么需要导出myProc吗?我想我需要导出我在模块外使用的任何东西。提前谢谢!执行
spawn
会创建一个具有自己上下文的新进程,因此在该进程中,您不再在模块内部,也不再从“外部”调用函数。因此,它需要出口。