我的消息传递示例有什么问题?

What is wrong with my message passing example?

我正在尝试从我生成的一个进程向另一个进程发送消息以进行分配,我觉得我在这里非常接近,但我认为我的语法有点偏离:

-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 进行打印。

四件小事:

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

    io:fwrite("~p~n", [Message])
    

    因为 Message 是一个元组,而不是字符串,将它作为第一个参数传递给 io:fwrite 会导致 badarg 错误。让我们请 io:fwrite 为我们格式化它。

  • process2 可能会在打印消息后调用自身。否则,它会收到一条消息然后退出。

所以现在您可以 运行 代码,并且在 运行ning 期间您可以加载带有不同消息的模块的新版本(所谓的 "hot code swapping")。这会改变正在打印的消息吗?为什么/为什么不?

不会。 process1 对自身进行 local 调用,这意味着它保留在模块的旧版本中。改为进行外部调用(显式指定模块:assignment6:process1(N-1, Pid)),它将切换到新版本。