Erlang消息传递示例

时间:2018-12-11 07:49:36

标签: recursion erlang message-passing erlang-shell hotswap

我正在尝试从一个进程发送一条消息,然后将其发送给另一个进程进行分配,我觉得我离这里很近,但是我认为我的语法有点不对:

-module(assignment6).
-export([start/1, process1/2, process2/0, send_message/2]).

process1(N, Pid) ->

    Message = "This is the original Message",

    if 
        N == 1 ->
            timer:sleep(3000),
            send_message(Pid, Message);

        N > 1 ->
            timer:sleep(3000),
            send_message(Pid, Message),
            process1(N-1, Pid);

        true ->
            io:fwrite("Negative/0, Int/Floating-Point Numbers not allowed")
    end.

process2() ->
    recieve
        Message ->
            io:fwrite(Message),
            io:fwrite("~n");
    end.

send_message(Pid, Message) ->
    Pid ! {Message}.

start(N) ->
    Pid = spawn(assignment6, process2, []),
    spawn(assignment6, process1, [N, Pid]).

该程序的目标是在启动该功能时将消息打印N次,但会延迟足够长的时间,以便我可以在运行中热交换消息的措词。我只是不太想将邮件发送到process2进行打印。

1 个答案:

答案 0 :(得分:2)

四件小事:

  • 它的拼写是receive,而不是recieve
  • 删除process2中的分号。 receive表达式中的最后一个子句没有终止分号。您可以在if的{​​{1}}表达式中看到这一点:前两个子句以分号结尾,而第三个子句不以分号结尾。
  • process1中,打印如下消息:

    process2

    由于io:fwrite("~p~n", [Message]) 是一个元组而不是字符串,将其作为第一个参数传递给Message会导致io:fwrite错误。让我们要求badarg为我们格式化它。

  • io:fwrite在打印消息后应该会自行调用。否则,它将收到一条消息,然后退出。

因此,现在您可以运行代码,并且在运行时,您可以使用不同的消息加载模块的新版本(即所谓的“热代码交换”)。这会改变正在打印的消息吗?为什么/为什么不呢?

  

不会。 process2对自身进行 local 调用,这意味着它停留在模块的旧版本中。改为进行外部呼叫(明确指定模块:process1),它将切换到新版本。