【问题标题】:Exchanging messages between two processes in Erlang在 Erlang 中的两个进程之间交换消息
【发布时间】:2013-11-23 19:11:36
【问题描述】:

您好,我正在学习 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 === 进程 出错,退出值:{undef,[{roundtrip,proc,"\n" ,[]}]}

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

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

谢谢。

【问题讨论】:

    标签: concurrency erlang


    【解决方案1】:

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

    另一个问题是你的 if 条件没有涵盖M =/= 0 时的另一种可能性。我会这样做:

    -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

    【讨论】:

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

    你需要导出myProc/1函数。或者你可以使用spawn/1:

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

    【讨论】:

      猜你喜欢
      • 2012-12-11
      • 1970-01-01
      • 2016-04-30
      • 1970-01-01
      • 1970-01-01
      • 2015-11-27
      • 2016-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多