【问题标题】:What is wrong with my message passing example?我的消息传递示例有什么问题?
【发布时间】:2019-05-12 04:09:03
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    四件小事:

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

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

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

    • process2 应该在打印消息后调用自己。否则,它将收到一条消息然后退出。

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

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

    【讨论】:

    • 谢谢!这些建议非常有效,而且我无法拼写:/。我相信热交换现在应该可以工作了吗?我所要做的就是在它运行时重新编译它吗?我只需要切换消息的实际内容。
    • 太棒了!你是救生员。 Erlang 是一门非常有趣的语言,让我大吃一惊。再次感谢您的帮助。
    • 很高兴听到!我在答案本身中添加了关于热代码交换的注释,正确隐藏为剧透。
    猜你喜欢
    • 1970-01-01
    • 2017-09-14
    • 2011-03-14
    • 1970-01-01
    • 2013-06-06
    • 2021-10-12
    • 2021-01-29
    • 2015-05-27
    • 2020-05-24
    相关资源
    最近更新 更多